如何在form.save之前显示Django友好的forms.ValidationError/message.error?
我想知道如何在form.save之前显示Django message.error(如果用户收到该错误消息,表单将不会保存,用户必须再次在表单中填充值) 我不知道我是否把它们放在了错误的地方或者其他原因,我肯定可以得到关于循环和if-else的如何在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):
的正确值,但是如果用户的工作时间>=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”
@Begin2Pipself。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'
@Begin2Pipself。kwargs
是在表单的init函数中设置的。您需要在调用super()。\uuuu init\uu(*args,**kwargs)
后添加代码。