2010-10-10 53 views
3

我是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

+0

爲什麼我的答案到第一個鏈接的問題的幫助?這似乎是你的問題的答案。 – 2010-10-10 21:06:22

+0

因爲它是爲管理後端,我需要在前端的功能(我忘了提到這一點)我試圖使用你的代碼前端,但它沒有工作。 – sewid 2010-10-11 04:21:23

+0

我不明白爲什麼這不起作用o utside管理員。只需在視圖代碼中創建inlineformset。 – 2010-10-11 06:29:29

回答

1

我已經絆倒了這個自己幾乎意外。我有一個內聯formset,它上面有一個modelchoicefield。該modelchoice沒有empty_label。所以在技術上並不完全是空白的。當內聯表單上的其他字段被忽略時,它將顯示驗證錯誤(您可以輕鬆地在視圖中對此進行測試,並且不保存主表單,除非所有內聯表單都有效)。

所以,看起來你剩下兩個選擇:1)用無效文本填充日期表單(即不是日期,某種「幫助器」文本),當它留在那裏並提交時無法驗證,或者2)將你的日期選擇器重新設置爲沒有空白狀態的下拉小部件 - 這樣就迫使用戶選擇一些東西(但是你可能更喜歡適當的javascript日期小部件,這會使多個下拉繁重。)

+0

謝謝!我有同樣的錯誤;) – dnaranjo 2014-03-14 17:52:06