Контекст настройки FormView для form_invalid

Я пытаюсь присвоить значение контексту, если форма недопустима. Это то, что я делаю. Однако в случае, если форма недействительна, мой ответ странный, и я не получаю форму.

{'key': 'Val', 'form': <MainLoginForm bound=True, valid=True, fields=(user_name;user_category;user_password)>, u'view': <mainApp.views.MainLoginFormView object at 0x107553c10>}  Submit

Это класс

class MainLoginFormView(FormView):
    template_name = 'login.html'
    form_class = MainLoginForm
    success_url = "login.hrml"
    args = {}

    def ValidateAccount(self,form):
        if(valid) #Some Condition to confirm if valid form 
            return super(MainLoginFormView, self).form_valid(form)
        else:
            return self.form_invalid(form)


    def form_invalid(self, form):
        MainLoginFormView.args = super(MainLoginFormView, self).get_context_data(**MainLoginFormView.args)
        MainLoginFormView.args["key"] = "Val"
        MainLoginFormView.args["form"] = form
        #return self.render_to_response(context=MainLoginFormView.args)
        return super(MainLoginFormView,self).form_invalid(MainLoginFormView.args)

    def form_valid(self, form, **kwargs):
        MainLoginFormView.args = kwargs
        .....
        return self.ValidateAccount(form)

2 ответа

  1. form_invalid метод принимает только форму в качестве входных данных. Вы можете переопределить его, чтобы удовлетворить ваши требования, как это:

    Необходимо переименовать args в kwargs

    def form_invalid(self, form):   
        # Do your your stuff here , 
        MainLoginFormView.kargs["key"] = "Val"
        MainLoginFormView.kargs["form"] = form
        return self.render_to_response(self.get_context_data(**MainLoginFormView.kargs))
    
  2. Это покажется немного странным, но рекомендуется делегировать ответственность за обновление контекста ответа get_context_dataметоду.

    def get_context_data(self, **kwargs):
        form = kwargs.pop('form', None)  # form becomes None if no form key is provided
        ctx = super(MainLoginFormView, self).get_context_data(form=form)  # This super call will append the form to our context
        ctx.update(**kwargs)  # Let's append the extra_args to our context
        return ctx
    
    def form_invalid(self, form, **kwargs):
        # in order to work, the super call to get_context_data needs a form item
        kwargs.update({'form': form})
        return self.render_to_response(self.get_context_data(**kwargs))
    
    def ValidateAccount(self, form):
        if(valid):  # A condition to confirm whether the form is valid or not 
            return super(MainLoginFormView, self).form_valid(form)
        else:
            extra_args = {
                'key': 'Val'
            }
            return self.form_invalid(form, **extra_args)
    

    Примечание: {'key': 'Val'}добавляется в ValidateAccount метод.