python - 如何将用户对象传递给 Django 中的表单

标签 python django forms view

如何将用户对象或请求传递到我的表单以将其用作输入文本框的初始值?

例如,我有我的表格:

class ContactForm(forms.Form):
contact_name = forms.CharField(required=True, initial="???")
contact_email = forms.EmailField(required=True)
subjects = forms.ChoiceField(choices=emailsubjects)
content = forms.CharField(
    required=True,
    widget=forms.Textarea
)

def __init__(self, *args, **kwargs):
    self.request = kwargs.pop("request")
    super(ContactForm, self).__init__(*args, **kwargs)
    self.fields['contact_name'].label = "Your name:"
    self.fields['contact_email'].label = "Your email:"
    self.fields['content'].label = "What do you want to say?"
    self.fields['subjects'].label = "Please, select the subject of your message"

我希望我的 user.first_name 成为 contact_name 字段的默认值。

这是我的 views.py,我在其中调用表单:

def ContactsView(request):
form_class = ContactForm(request=request)
# 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', '')
        subjects = form.cleaned_data['subjects']
        subjects = dict(form.fields['subjects'].choices)[subjects]
        # Email the profile with the
        # contact information
        template = get_template('threeD/email/contact_template.txt')
        context = Context({
            'contact_name': contact_name,
            'subjects': subjects,
            'contact_email': contact_email,
            'form_content': form_content,
        })
        content = template.render(context)

        email = EmailMessage(
            "New message from " + contact_name,
            content,
            "Message - " + subjects + ' ',
            ['smart.3d.printing.facility@gmail.com'],
            headers={'Reply-To': contact_email}
        )
        email.send()
        messages.success(request, "Thank you for your message.")
        return redirect('/index/contacts/')


return render(request, 'threeD/contacts.html', {
    'form': form_class,
})

非常感谢任何帮助

最佳答案

您已更改表单以获取请求对象。因此,您可以在表单的方法中访问 self.request.user:

class ContactForm(forms.Form):
    ...
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super(ContactForm, self).__init__(*args, **kwargs)
        self.fields['contact_name'].label = "Your name:"
        self.fields['contact_name'].initial = self.request.user.first_name

您还必须更新 View 以传递请求对象。请记住更新 GET 和 POST 请求的代码。

if request.method == 'POST':
    form = ContactForm(data=request.POST, request=request)
    ...
else:
    # GET request
    form = ContactForm(request=request)

最后,通过将请求传递给表单,您已将它与 View 紧密耦合。将 user 传递给表单可能会更好。这将使单独测试表单和 View 变得更容易。如果您更改表单,请记住也要更新 View 。

关于python - 如何将用户对象传递给 Django 中的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43347566/

相关文章:

python - 网络爬虫 - 忽略 Robots.txt 文件?

python - 如何从二进制字段查找文件 mimetype

django - 当主机系统上只有Nginx时,使用Docker的静态文件

ruby-on-rails - 在 rails 中使用邮件表单进行联系:Errno::ECONNREFUSED: Connection refused - connect(2)

javascript - 警报阻止 "required field"弹出窗口

python - 快速正则表达式 Python 3 不起作用

python - 按A列分组并按列聚合时获取列对应的值

python - 参数化 SQL 查询中 pg_trgm % 运算符的问题

django - 表 django 站点不存在

javascript - 使用JavaScript的submit()函数时如何运行HTML5表单验证?