如何在form.save之前显示Django友好的form.ValidationError/message.error? [英] How to display Django friendly forms.ValidationError/message.error before form.save?

查看:202
本文介绍了如何在form.save之前显示Django友好的form.ValidationError/message.error?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to know how to display Django message.error before form.save(if user get that error message, the form won't be saved, user have to fill value in form again).

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

I don't know whether I put them at wrong place or anything else reason, I can definitely get the right value about for loop and if else, but if a user's work_times >= 8 hours, page didn't display that error message, and project can save like before, but I did add for loop and if else!! The partial code of views.py is like this:

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})

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

Thanks so much for any advice.

推荐答案

使表单提交无效的一般方法是使用错误呈现给定的表单.

The general approach to make a form submit invalid, is to render the given form with errors.

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

You can either send some necessary data to the form and customise the form's clean method...

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方法并使用新的错误消息重新呈现表单.

... or you can customize the form_valid method of the view and re-render the form with the new error message.

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 }}.

The errors will appear {{ form.non_field_errors }} in the template.

这篇关于如何在form.save之前显示Django友好的form.ValidationError/message.error?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆