我是django的新手(直到现在,我使用的是symfony PHP框架)。我的问题是这样的:
我有一个事件模型和日期模型。日期具有事件的外键,因此事件可以(或应该)具有一个或多个日期。

现在,我想拥有一个用于创建事件的表单,该表单应包含一个用于添加一个对应日期的子表单(如果事件具有多个日期,则应在以后添加更多日期)。

我使用inlineformset实现了Date子窗体,但是如果未输入Date,则不会发生错误,并且事件将在没有Date的情况下被保存。我想要做的就是使此inlineformset成为必需,或者说必须(至少)有一个inlineformset。

我找到了这些问题,但是没有一个答案对我有帮助:

  • Inline Form Validation in Django
  • Django formsets: make first required?

  • 对我有什么提示吗?

    编辑:我需要此为前端,而不是后端。第一个链接涵盖了管理后端。

    EDIT2:添加了一些源代码

    MandatoryInlineFormSet.py:
    from django.forms.models import BaseInlineFormSet
    from django import forms
    
    class MandatoryInlineFormSet(BaseInlineFormSet):
        def clean(self):
            # get forms that actually have valid data
            count = 0
            for form in self.forms:
                try:
                    if form.cleaned_data:
                        count += 1
                except AttributeError:
                    # annoyingly, if a subform is invalid Django explicity raises
                    # an AttributeError for cleaned_data
                    pass
            if count < 1:
                raise forms.ValidationError('You must have at least one order')
    

    event.py:
    from [...]
    def new(request):
        DateFormset = inlineformset_factory(
                Event,
                Date,
                can_delete=False,
                extra=1,
                max_num=1,
                formset=MandatoryInlineFormSet,
                )
    
        if request.POST:
            form = EventForm(request.POST)
            date_formset = DateFormset(request.POST)
            if form.is_valid():
                event = form.save(commit=False)
                date_formset = DateFormset(request.POST, instance=event)
                if date_formset.is_valid():
                    event.save()
                    date_formset.save()
                    return HttpResponseRedirect(reverse('frontpage'))
        else:
            form = EventForm()
            date_formset = DateFormset()
        return render_to_response('event/new.html', {
            'form': form,
            'date_formset': date_formset,
            }, context_instance=RequestContext(request))
    

    event / new.html:
    [...]
    <form action="{% url new-event %}" method="post">
        {% csrf_token %}
        {{ form.as_p }}
    
        {{ date_formset.management_form }}
        {% for date_form in date_formset.forms %}
            {{ date_form.as_p }}
        {% endfor %}
    
    
        <input type="submit" value="{% trans "Create event" %}"/>
    </form>
    [...]
    

    最好的祝福,
    缝制

    最佳答案

    我几乎是偶然地绊倒了自己。我有一个内联表单集,上面有一个modelchoicefield。该模型选择没有empty_label。因此,从技术上讲,它并不是完全空白。当内联表单上遗漏其他字段时,它将显示验证错误(您可以在 View 中轻松地对此进行测试,除非所有内联表单均有效,否则不保存主表单)。

    因此,似乎您有两个选择:1)在日期表单中填充无效的文本(即不是日期,某种形式的“帮助”文本),当该文本保留在那里并提交后无法验证时,或者2)返工您的日期选择器可以选择没有空白状态的下拉小部件-从而迫使用户选择某些东西(但您可能更喜欢使用适当的javascript日期小部件,这会使繁琐的下拉操作变得麻烦。

    10-08 06:48