首页 > 解决方案 > 将初始值从先前的详细视图传递到表单字段

问题描述

我有点困惑如何做到这一点,我在用户详细信息页面上有一个“联系用户”按钮。我正在尝试将电子邮件字段的初始表单值设置为用户从上一个详细信息页面视图发送的电子邮件,以便预先填充。

我会将 user.email 作为 kwarg 传递到按钮 url 中吗?

视图.py

def Contact(request):
    form_class = ContactForm

    # new logic!
    if request.method == 'POST':

        form = form_class(data=request.POST)

        if form.is_valid():
            contact_name = request.POST.get(
                'contact_name'
            , '')
            contact_email = request.POST.get(
                'contact_email'
            , '')
            form_content = request.POST.get('content', '')

            # Email the profile with the
            # contact information
            template = get_template('contact_template.txt')
            context = {
                'contact_name': contact_name,
                'contact_email': contact_email,
                'form_content': form_content,
            }
            content = template.render(context)

            email = EmailMessage(
                "New contact form submission",
                content,
                "Your website" +'',
                ['youremail@gmail.com'],
                headers = {'Reply-To': contact_email }
            )
            email.send()
            return redirect('contact_form')


    return render(request, 'portal/contact_form.html', {
        'form': form_class,
    })

表格.py

from django import forms
class ContactForm(forms.Form):
    contact_name = forms.CharField(required=True)
    contact_email = forms.EmailField(required=True, initial='{ kwarg }')
    content = forms.CharField(
        required=True,
        widget=forms.Textarea
    )

user_detail.html

<div class="col-lg-4 text-center p-5" style="padding-right:20px; border-right: 1px solid #e5e5e5;">
              <a href="{% url 'portal:contact_form' kwarg.user.email %}">
                <h1><i class="fa fa-2x fa-envelope-o text-success" aria-hidden="true"></i></h1>
                <p class="text-muted mt-3 ">Contact Customer</p>
              </a>
            </div>

标签: djangoforms

解决方案


有多种方法可以做到这一点。例如:

方法一:在 URL Querystring 中发送

从您以前的详细信息视图中,以 url 查询字符串发送电子邮件。例如:

 def DetailForm(request, *args, **kwargs):
      ... 
      if form.is_valid():
           # do some things
           user_email = form.cleaned_data.get('user_email')  # assuming its the form field you are using for catching user email

           redirect_url = "{}?user_email={}".format(self.get_success_url(), user_email)
           return HttpResponseRedirect(redirect_url)

并在下一个表单视图中捕获它:

  def Contact(request):
     form_class = ContactForm(initial={'contact_email': request.GET.get('user_email')})
     ...

方法2:在会话中存储。

它与最后一种方法几乎相似,但它将数据存储在session中。

def DetailForm(request, *args, **kwargs):
      ... 
      if form.is_valid():
           # do some things
           request.session['user_email'] = form.cleaned_data.get('user_email')  # Storing data in session

           # every other code

并在下一个表单视图中获取它:

  def Contact(request):
     form_class = ContactForm(initial={'contact_email': request.session.get('user_email')})
     ...

更新

如果您来自详细信息页面,则意味着您可以访问该对象。因此,在详细信息页面中,contact像这样更新按钮:

<a href="{% url 'portal:contact_form' object.email %}">contact</a>  // or user.email if you are passing user object as user in context

在联系人视图中:

def Contact(request, email):
    if request.method == "GET":
        form = ContactForm(initial={'contact_email': email)})

推荐阅读