我想知道如何在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})
非常感谢您提供任何建议。
答案 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)