我是django的新手(直到現在,我使用了symfony PHP Framework)。我的問題是這樣的: 我有一個模型事件和模型日期。日期有一個事件的外鍵,以便一個事件可能(或應該)有一個或多個日期。在django中創建inlineformset需要
現在我想創建一個表單來創建事件,並且此表單應該包含一個用於添加相應日期的子表單(如果該事件具有多個日期,則應該稍後添加更多日期)。
我使用inlineformset來實現日期子窗體,但是如果沒有輸入日期,則不會發生錯誤並且事件正在保存而沒有日期。我所要做的就是使這個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>
[...]
最好的問候, sewid
爲什麼我的答案到第一個鏈接的問題的幫助?這似乎是你的問題的答案。 – 2010-10-10 21:06:22
因爲它是爲管理後端,我需要在前端的功能(我忘了提到這一點)我試圖使用你的代碼前端,但它沒有工作。 – sewid 2010-10-11 04:21:23
我不明白爲什麼這不起作用o utside管理員。只需在視圖代碼中創建inlineformset。 – 2010-10-11 06:29:29