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

在我的应用程序中,我需要以下行为:

  • 用户转到联系人表单url
  • 用户填写联系人表单
  • (a) 如果用户已登录,请验证并提交表单
  • (b) 如果用户未登录,请重定向到登录表单进行登录,然后如果用户凭据已验证,请提交表单
  • 在我的
    视图.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)
    来防止重复。