如何在 form.save 之前显示 Django 友好表单。ValidationError/message.error?
How to display Django friendly forms.ValidationError/message.error before form.save?
我想知道如何在 form.save 之前显示 Django message.error(如果用户收到该错误消息,表单将不会保存,用户必须再次在表单中填写值) .
不知道是我放错地方了还是其他什么原因,我肯定能得到关于for loop and if else
的正确值,但是如果用户的work_times >= 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})
非常感谢您的建议。
您不会在 form_valid
中执行此操作 - 顾名思义,到那时该表单已被视为有效。事实上,您根本不会在视图中执行此操作。这种东西属于表单,具体来说属于 ProjectForm 的 clean()
方法。在那里你可以用你的消息提出forms.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_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)
我想知道如何在 form.save 之前显示 Django message.error(如果用户收到该错误消息,表单将不会保存,用户必须再次在表单中填写值) .
不知道是我放错地方了还是其他什么原因,我肯定能得到关于for loop and if else
的正确值,但是如果用户的work_times >= 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})
非常感谢您的建议。
您不会在 form_valid
中执行此操作 - 顾名思义,到那时该表单已被视为有效。事实上,您根本不会在视图中执行此操作。这种东西属于表单,具体来说属于 ProjectForm 的 clean()
方法。在那里你可以用你的消息提出forms.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_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)