如何在form.save之前显示Django友好的form.ValidationError / message.error?

时间:2018-08-16 07:28:50

标签: django python-3.x django-models django-forms message

我想知道如何在form.save之前显示Django message.error(如果用户收到该错误消息,则不会保存该表单,用户必须再次在表单中填充值)。

我不知道我将它们放在错误的位置还是其他原因,我肯定可以获得for loop and if else的正确值,但是如果用户的工作时间> = 8小时,则页面不会显示该值错误消息,项目可以像以前一样保存,但是我确实添加了for loop and if else! views.py的部分代码如下:

class ProjectCreateView(CreateView):
    model = Project
    form_class = ProjectForm

    def form_valid(self, form):
        request = self.request
        for u in user_project:
            user_times = int(sum(t['learn_times'] for t in times))
            if user_times >= 8 or int(request.POST.get('learn_times')) + user_times >= 8:
                messages.error(self.request, u.username + "'s learn_times is more than 8 hours, please check!")
            else:
                pass
        project = form.save(commit=False)
        project.save()
        form.save_m2m()

        messages.success(self.request, 'Project created successfully!')
        return super(CoursePermitCreateView, self).form_valid(form)

    def get_success_url(self):
        return reverse('project_change', kwargs={'pk': self.object.pk})

非常感谢您提供任何建议。

3 个答案:

答案 0 :(得分:2)

您不必在form_valid中执行此操作-顾名思义,到那时,该表格已被视为有效。实际上,您根本不会在视图中执行此操作。这种事情属于形式,特别是ProjectForm的clean()方法中。您可以在其中提出forms.ValidationError的信息;视图将做正确的事并重新显示无效的表单。

答案 1 :(得分:1)

使表单提交无效的一般方法是使给定的表单出现错误。

您可以向表单发送一些必要的数据,并自定义表单的clean方法...

import forms

class Projectform(forms.ModelForm):
    def __init__(user_project, request, *args, **kwargs):
        self.user_project = user_project
        self.request = request
        super().__init__(*args, **kwargs)

    def clean(self, *args, **kwargs)
        for u in self.user_project:
            user_times = int(sum(t['learn_times'] for t in times))
            if user_times >= 8 or int(self.request.POST.get('learn_times')) + user_times >= 8:
            raise forms.ValidationError(u.username + "'s learn_times is more than 8 hours, please check!")
        return super().clean(*args, **kwargs)

...,或者您可以自定义视图的form_valid方法,并使用新的错误消息重新呈现表单。

class ProjectCreateView(CreateView):
    model = Project
    form_class = ProjectForm

    def form_valid(self, form):
        request = self.request
        for u in user_project:
            user_times = int(sum(t['learn_times'] for t in times))
            if user_times >= 8 or int(request.POST.get('learn_times')) + user_times >= 8:
                form.add_error('__all__', self.request, u.username + "'s learn_times is more than 8 hours, please check!")
                return super().form_invalid(form)

    messages.success(self.request, 'Project created successfully!')
    return super().form_valid(form)

错误将在模板中显示{{ form.non_field_errors }}

答案 2 :(得分:0)

使用Tobias的上述答案并将pk作为方法中的变量传递

test=Test.objects.get(pk=self.pk)