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

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

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

  1. class ContactForm(forms.Form):
  2. contact_name = forms.CharField(required=True, initial="???")
  3. contact_email = forms.EmailField(required=True)
  4. subjects = forms.ChoiceField(choices=emailsubjects)
  5. content = forms.CharField(
  6. required=True,
  7. widget=forms.Textarea
  8. )
  9. def __init__(self, *args,**kwargs):
  10. self.request = kwargs.pop("request")
  11. super(ContactForm, self).__init__(*args,**kwargs)
  12. self.fields['contact_name'].label = "Your name:"
  13. self.fields['contact_email'].label = "Your email:"
  14. self.fields['content'].label = "What do you want to say?"
  15. self.fields['subjects'].label = "Please, select the subject of your message"

我希望我的user.first\u name作为联系人\u name字段的默认值。
这是我的views.py,我在这里调用表单:

  1. def ContactsView(request):
  2. form_class = ContactForm(request=request)
  3. # new logic!
  4. if request.method == 'POST':
  5. form = form_class(data=request.POST)
  6. if form.is_valid():
  7. contact_name = request.POST.get(
  8. 'contact_name'
  9. , '')
  10. contact_email = request.POST.get(
  11. 'contact_email'
  12. , '')
  13. form_content = request.POST.get('content', '')
  14. subjects = form.cleaned_data['subjects']
  15. subjects = dict(form.fields['subjects'].choices)[subjects]
  16. # Email the profile with the
  17. # contact information
  18. template = get_template('threeD/email/contact_template.txt')
  19. context = Context({
  20. 'contact_name': contact_name,
  21. 'subjects': subjects,
  22. 'contact_email': contact_email,
  23. 'form_content': form_content,
  24. })
  25. content = template.render(context)
  26. email = EmailMessage(
  27. "New message from " + contact_name,
  28. content,
  29. "Message - " + subjects + ' ',
  30. ['smart.3d.printing.facility@gmail.com'],
  31. headers={'Reply-To': contact_email}
  32. )
  33. email.send()
  34. messages.success(request, "Thank you for your message.")
  35. return redirect('/index/contacts/')
  36. return render(request, 'threeD/contacts.html', {
  37. 'form': form_class,
  38. })

任何帮助都将不胜感激

watbbzwu

watbbzwu1#

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

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

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

  1. if request.method == 'POST':
  2. form = ContactForm(data=request.POST, request=request)
  3. ...
  4. else:
  5. # GET request
  6. form = ContactForm(request=request)

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

展开查看全部
lmvvr0a8

lmvvr0a82#

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

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

相关问题