Django:以form.clean()返回消息

时间:2019-05-20 17:45:36

标签: python django

假设我有一个使用ModelForm添加新日历事件的CreateView。有时,添加新的日历事件时,必须在新事件之前添加另一个日历事件,以便能够成功验证新事件(发生在ModelForm.clean()方法中)。我认为可以在验证新事件的验证之前,在clean方法中添加此其他事件的唯一位置。我对吗,这是我唯一可以做的地方?我想让用户知道这是使用Django消息发生的,但是我当然无法访问ModelForm中的请求对象。这使我认为我必须将该事件添加到另一个位置。哪种CreateView方法适合此目的?

对于英语,如果我的问题措辞不够好,我感到抱歉。预先感谢。

2 个答案:

答案 0 :(得分:0)

如果您确实希望访问表单中的请求对象,则可以在CreateView中覆盖get_form_kwargs方法(这将在表单的clean方法中提供对self.request的访问):

class YourViewName(CreateView):
    def get_form_kwargs(self):
         kwargs = super(YourViewName, self).get_form_kwargs()
         kwargs.update({'request': self.request})
         return kwargs

但是,对于您的方案,最好在视图中的form_valid方法内进行验证。如果验证失败,则可以设置消息,然后调用form_invalid()来重新呈现带有错误消息的表单。

class YourViewName(CreateView):
    def form_valid(self, form):
        if not your_check_goes_here():
            messages.error(self.request, _("Form is Invalid"))
            return self.form_invalid(form)
        return super(YourViewName, self).form_valid(form)

答案 1 :(得分:0)

如果您不使用ModelForm,而是使用自定义表单,则可以更好地控制操作。然后,您可以将请求传递给表单,并在清理过程中使用它。

以下是我的其中一个表单的示例,我需要访问该请求以保存表单内容:

class RatifyQuestionForm(forms.Form):
    ...
    ...

    def __init__(self, *args, **kwargs): 
        self.request = kwargs.pop('request')
        ....
        ....

    def save(self):
        data = self.cleaned_data
        # create approval record
        ratification = Ratification.objects.create(
                        assessment=data['assessment'],
                        alternative=data['alternative'],
                        author=request.user)

以类似的方式,您可以通过clean方法访问self.request。

您可以在视图中实例化表单:

if request.method == 'POST':
    form = RatifyQuestionForm(request.POST, request=request)