Django 未激发自定义表单集验证错误
我创建了一个自定义验证错误,它在抽象基于类的视图之前工作得很好。出于某种原因,每当出现错误时,错误都是空白的,例如[{}] 验证错误逻辑:Django 未激发自定义表单集验证错误,django,django-forms,django-views,Django,Django Forms,Django Views,我创建了一个自定义验证错误,它在抽象基于类的视图之前工作得很好。出于某种原因,每当出现错误时,错误都是空白的,例如[{}] 验证错误逻辑: class BaseFormSetValidation(BaseModelFormSet): def clean(self): super().clean() days = ['day_1', 'day_2', 'day_3', 'day_4', 'day_5', 'day_6', 'day_7']
class BaseFormSetValidation(BaseModelFormSet):
def clean(self):
super().clean()
days = ['day_1', 'day_2', 'day_3', 'day_4', 'day_5', 'day_6', 'day_7']
for form in self.forms:
for day in days:
current_day = form.cleaned_data.get(day)
if current_day is not None and current_day > 24:
raise ValidationError([{day: ["Submitted hours per day cannot exceed 24 hours"]}])
class DivErrorList(ErrorList):
def __str__(self):
return self.as_divs()
def as_divs(self):
if not self: return ''
return '%s' % ''.join([e for e in self])
TimesheetModelFormSet = modelformset_factory(Timesheet, formset=BaseFormSetValidation, exclude=("year", "week", "project", "user"), extra=0)
TemplateView类
继承自
class BaseTimesheet(object):
...
def get_context_data(self, **kwargs):
context = super(BaseTimesheet, self).get_context_data(**kwargs)
year = kwargs.get("year") or datetime.datetime.now().year
week = kwargs.get("week") or Week.thisweek().week
user = self.request.user
next_year, next_week = calc_next(year, week)
previous_year, previous_week = calc_previous(year, week)
calc_full_week = self.calc_full_week(year, week)
context.update(
week=week,
year=year,
next_week=next_week,
previous_week=previous_week,
next_year=next_year,
previous_year=previous_year,
current_week=calc_full_week
)
return context
以及具有错误处理的模板:
{% for row in timesheet_formset %}
{% if row.errors %}
<div class="col-lg-10 offset-lg-1 text-center">
<div class="alert alert-warning alert-dismissible fade show">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
Error on project {{ row.instance.project }}
{% endif %}
{% for field in row %}
{% if field.errors %}
{% for error in field.errors %}
<p>{{ field.label }} - {{ error }}</p>
{% endfor %}
{% endif %}
{% endfor %}
{% if row.errors %}
</div>
</div>
{% endif %}
{% endfor %}
{% if timesheet_formset.non_form_errors %}
<div class="col-lg-10 offset-lg-1 text-center">
<div class="alert alert-warning alert-dismissible fade show">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
{{ timesheet_formset.non_form_errors }}
</div>
</div>
{% endif %}
问题是您没有将表单移交:
def post(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
timesheet_formset = self.form_class(request.POST)
if timesheet_formset.is_valid():
messages.info(request, "Weekly timesheet updated", extra_tags='timesheet')
timesheet_formset.save()
success_url = reverse("timesheets:current-week", args=(context["year"], context["week"]))
return HttpResponseRedirect(success_url)
return render(request, "timesheets/timesheet.html", self.get_context_data(**kwargs))
无需调用self.get_context_data**kwargs与相同的kwargs,它们将是相同的。您必须像在原始视图中一样移交时间表表单集并创建时间表表单
这将导致如下结果:
def post(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
timesheet_formset = self.form_class(request.POST)
if timesheet_formset.is_valid():
messages.info(request, "Weekly timesheet updated", extra_tags='timesheet')
timesheet_formset.save()
success_url = reverse("timesheets:current-week", args=(context["year"], context["week"]))
return HttpResponseRedirect(success_url)
context['timesheet_formset'] = timesheet_formset
create_timesheet_form = TimesheetModelForm(request.user)
context['create_timesheet_form '] = create_timesheet_form
return render(request, "timesheets/timesheet.html", )
您必须测试是否同时需要时间表表单集和创建时间表表单。具有完全相同的raise ValidationError。。。以前工作过吗?抽象我的基于类的视图是什么意思?我将用TimesheetEditor类以前的样子和DivErrorList工作的地方更新我的问题,@bb4L?继承:让基本时间表成为一个模板视图,然后时间表编辑器只从基本时间表继承。这有什么区别?在过去的两天里,我一直在挠头,试图通过添加'create_timesheet_form=TimesheetModelFormrequest.user'和context['timesheet_formset',让它正常工作我有时讨厌django。非常感谢你的帮助!
def post(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
timesheet_formset = self.form_class(request.POST)
if timesheet_formset.is_valid():
messages.info(request, "Weekly timesheet updated", extra_tags='timesheet')
timesheet_formset.save()
success_url = reverse("timesheets:current-week", args=(context["year"], context["week"]))
return HttpResponseRedirect(success_url)
return render(request, "timesheets/timesheet.html", self.get_context_data(**kwargs))
def post(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
timesheet_formset = self.form_class(request.POST)
if timesheet_formset.is_valid():
messages.info(request, "Weekly timesheet updated", extra_tags='timesheet')
timesheet_formset.save()
success_url = reverse("timesheets:current-week", args=(context["year"], context["week"]))
return HttpResponseRedirect(success_url)
context['timesheet_formset'] = timesheet_formset
create_timesheet_form = TimesheetModelForm(request.user)
context['create_timesheet_form '] = create_timesheet_form
return render(request, "timesheets/timesheet.html", )