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">&times;</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">&times;</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", )