3

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

现在我想要一个表单来创建事件,这个表单应该包括一个用于添加一个相应日期的子表单(如果事件有多个日期,则应该稍后添加更多日期)。

我使用 inlineformset 来实现 Date 子表单,但是如果没有输入 Date,则不会发生错误,并且 Event 正在保存而没有 Date。我想要的只是使这个 inlineformset 成为必需,或者说,必须至少(并且只有)一个 inlineformset。

我发现了这些问题,但没有一个答案对我有帮助:

对我有什么提示吗?

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

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')

事件.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))

事件/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>
[...]

最好的问候,sewid

4

1 回答 1

1

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

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

于 2011-01-06T01:59:05.750 回答