Python Django表单数据在post要求登录时丢失
在我的应用程序中,我需要以下行为:Python Django表单数据在post要求登录时丢失,python,django,django-forms,Python,Django,Django Forms,在我的应用程序中,我需要以下行为: 用户转到联系人表单url 用户填写联系人表单 (a) 如果用户已登录,请验证并提交表单 (b) 如果用户未登录,请重定向到登录表单进行登录,然后如果用户凭据已验证,请提交表单 在我的视图.py中,我有: @method_decorator(login_required, name='post') class ContactView(FormView): template_name = 'extras/contact.html' form_cla
视图.py
中,我有:
@method_decorator(login_required, name='post')
class ContactView(FormView):
template_name = 'extras/contact.html'
form_class = ContactForm
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form, **kwargs)
else:
return self.form_invalid(form, **kwargs)
def form_valid(self, form):
instance = form.instance
instance.request_user = self.request.user
instance.save()
messages.success(self.request, "Thank you for contacting us! We will reach you soon.")
return super().form_valid(form)
def get_success_url(self):
return reverse('main_home')
包含post方法的想法就是从这个
这是行不通的。用户被重定向到登录表单,已登录,但在重定向丢失之前显示一个空白表单和输入的信息
如何解决此问题,有什么提示吗?将post请求重定向到登录页面时,您将丢失post数据。因此,您还应该重定向GET请求,以便用户在填写联系人表单之前登录。您可以通过修饰
dispatch
方法来实现这一点
@method_decorator(login_required, name='dispatch')
class ContactView(FormView):
对于基于类的泛型视图,重写
get
或post
方法通常不是一个好主意,因为您可以中断功能或必须复制代码。在您的情况下,post
方法似乎与FormView
的post方法没有任何不同,因此我将删除它。@Alasdair,我同意。我只是加入了对它应用一个登录所需的装饰程序,如果没有加入,它将无法工作。或者我可能测试得不够好。因为您使用了method\u decorator
,所以不必重写post
来装饰它。但是如果您这样做了,您可以调用super().post(request,*args,**kwargs)
来防止重复。