Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在form.save之前显示Django友好的forms.ValidationError/message.error?_Django_Python 3.x_Django Models_Django Forms_Message - Fatal编程技术网

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

如何在form.save之前显示Django友好的forms.ValidationError/message.error?,django,python-3.x,django-models,django-forms,message,Django,Python 3.x,Django Models,Django Forms,Message,我想知道如何在form.save之前显示Django message.error(如果用户收到该错误消息,表单将不会保存,用户必须再次在表单中填充值) 我不知道我是否把它们放在了错误的地方或者其他原因,我肯定可以得到关于循环和if-else的的正确值,但是如果用户的工作时间>=8小时,页面没有显示错误消息,project可以像以前一样保存,但我确实为循环和if-else添加了!!views.py的部分代码如下所示: class ProjectCreateView(CreateView):

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

我不知道我是否把它们放在了错误的地方或者其他原因,我肯定可以得到关于循环和if-else的
的正确值,但是如果用户的工作时间>=8小时,页面没有显示错误消息,project可以像以前一样保存,但我确实为循环和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})

非常感谢您的建议。

您在
表单中没有这样做\u valid
——顾名思义,到那时表单已经被认为是有效的。事实上,你根本不在视图中这样做。这类东西属于表单,特别是ProjectForm的
clean()
方法。在那里,您可以使用消息引发
表单。ValidationError
;然后视图将执行正确的操作并重新显示无效的表单。

form\u valid
中不执行此操作-顾名思义,此时表单已被视为有效。事实上,你根本不在视图中这样做。这类东西属于表单,特别是ProjectForm的
clean()
方法。在那里,您可以使用消息引发
表单。ValidationError
;然后视图将做正确的事情并重新显示无效的表单。

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

您可以向表单发送一些必要的数据,并自定义表单的
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\u 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}}

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

您可以向表单发送一些必要的数据,并自定义表单的
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\u 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}}

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

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

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

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


非常感谢Daniel,但它看起来像是forms.ValidationError是为程序员而不是为客户阅读的,它太难看了,一点也不真实。嗨Daniel,不管我如何更改代码,我总是会遇到一个丑陋的错误,看起来像是程序的bug,嗨Daniel,真的需要你的建议,我不能在forms.py中添加forms.ValidationError,也不能在views.py中添加form.add_error,就像我在forms.py中添加test=test.objects.get(pk=self.kwargs['pk'])时一样。如果您在表单to bed中使用self.kwargs在init方法中定义它,我得到的“ProjectForm”对象的错误没有属性“kwargs”。非常感谢Daniel,但是看起来forms.ValidationError是为程序员而不是为客户端而读的,太难看了不,那根本不是真的。嗨,丹尼尔,不管我怎么修改代码,我总是会遇到一个难看的错误,看起来像是程序的错误,嗨,丹尼尔,真的需要你的建议,我不能在forms.py中添加forms.ValidationError,也不能在views.py中添加form.add_error,就像我在forms.py中添加test=test.objects.get(pk=self.kwargs['pk'])时一样。如果您在表单to bed中使用self.kwargs在init方法中定义它,那么我得到的'ProjectForm'对象的错误没有属性'kwargs',我得到的错误是,
'ProjectForm'对象没有属性“kwargs”
,因为我必须通过
test=test.objects.get(pk=self.kwargs['pk'])、user\u project=list(UserProject.objects.filter(test=test))
Hi Tobias从另一个模型获取对象,如果我在forms.py的ProjectForm上使用
request.POST.get()
,也会得到错误的
“ProjectForm”对象没有属性请求
……嗨@Tobias Lorenz真的需要你的建议,我不能在forms.py中添加
表单。ValidationError
,也不能在views.py中添加
表单。add_error
,就像我添加
test=test.objects.get(pk=self.kwargs['pk']))
在forms.py中,我发现“ProjectForm”对象的错误没有属性“kwargs”
@Begin2Pip
self。kwargs
是在表单的init函数中设置的。您需要在调用
super()。\uuu init\uu(*args,**kwargs)
后添加代码。你好,托比亚斯,我得到了
'ProjectForm'对象没有属性'kwargs'
的错误,因为我必须通过
test=test.objects.get(pk=self.kwargs['pk'])、user\u project=list(UserProject.objects.filter(test=test))从另一个模型获取对象
Hi Tobias,如果我在forms.py的Projectform上使用
request.POST.get()
,也会得到
“Projectform”对象没有属性请求的错误
……Hi@Tobias Lorenz真的需要你的建议,我不能在forms.py中添加
表单。ValidationError
,也不能在views.py中添加
表单。add\u error
,当我在forms.py中添加
test=test.objects.get(pk=self.kwargs['pk'])
时,我得到了
'ProjectForm'对象的错误,它没有属性'kwargs'
@Begin2Pip
self。kwargs
是在表单的init函数中设置的。您需要在调用
super()。\uuuu init\uu(*args,**kwargs)
后添加代码。