如何在django中将用户对象传递给窗体

olmpazwi  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(281)

如何将用户对象或请求传递给表单,以便将其用作输入文本框的初始值?
例如,我有我的表格:

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\u name作为联系人\u 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,
})

任何帮助都将不胜感激

watbbzwu

watbbzwu1#

您已更改表单以获取请求对象。因此,您可以访问 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

您还必须更新视图以传递请求对象。记住更新get和post请求的代码。

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

最后,通过将请求传递给表单,您已经将其与视图紧密耦合。最好通过考试 user 改成表格。这样可以更容易地从视图中单独测试表单。如果更改表单,请记住也要更新视图。

lmvvr0a8

lmvvr0a82#

您需要在视图中传递初始值:
意见:

def ContactsView(request):
    form_class = ContactForm(request=request,
                             initial={'contact_name': request.user.first_name})
    ...

相关问题