【发布时间】:2025-12-09 20:30:01
【问题描述】:
我是 django 的新手(直到现在,我使用的是 symfony PHP 框架)。我的问题是这样的: 我有一个模型事件和模型日期。 Date 具有 Event 的外键,因此 Event 可能(或应该)有一个或多个 Dates。
现在我想要一个表单来创建事件,这个表单应该包含一个子表单,用于添加一个相应的日期(如果事件有多个日期,以后应该添加更多日期)。
我使用 inlineformset 来实现 Date 子表单,但是如果没有输入 Date,则不会发生错误,并且在没有 Date 的情况下保存 Event。我想要的只是使这个 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')
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))
事件/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>
[...]
最好的问候, 缝制
【问题讨论】:
-
为什么我对第一个链接问题的回答没有帮助?这似乎正是您问题的答案。
-
因为是后台管理的,所以前端需要这个功能(忘记说了)。我尝试将您的代码用于前端,但没有成功。
-
我不明白为什么这在管理员之外不起作用。只需在您的视图代码中创建内联表单集。
-
我试过了,但是当我将 inlineformset 留空时没有错误消息。我现在不在家,等我回家,我会发布我的代码。
-
好的,我添加了源代码。问题是,当将 inlineformset 留空并提交表单时,没有发生错误,事件被保存。如果事件表单有另一个错误,则标记错误,事件不保存,但inlineformset再次没有错误。
标签: django inline-formset