2013-06-21 34 views
0

好吧,我卡住了。通過中間形式保存到兩個模型 - Django

我現在的問題如下: 我有兩個型號,RelenvaceCodingRecordEventRecord
用戶應該能夠選擇文章是否相關。如果是,則表單中的其他字段應該是必需的,如果不是,則不需要字段。 這必須發生在同一頁上的一種形式,沒有JS。

我到目前爲止所做的是創建一個窗體(forms.Form),它有兩個模型的許多字段。繼this文章中,我試圖執行條件required邏輯:

class CodingForm(forms.Form): 
    relevance = forms.BooleanField(required=False) 
    event_date = forms.DateField('Event Date',required=False) 
    location = forms.ModelChoiceField(queryset=Location.objects.all(), empty_label=None, required=False) 
    actors = forms.CharField(max_length=100, required=False) 
    party = forms.NullBooleanField('Party') 
    labor_org = forms.NullBooleanField('Labor Organization') 
    property_dmg = forms.NullBooleanField('Property Damage') 
    violence = forms.NullBooleanField('Violence') 
    injured = forms.IntegerField(required=False) 
    deaths = forms.IntegerField(required=False) 
    participants_num = forms.IntegerField(required=False) 
    participants_str = forms.IntegerField(required=False) 
    anti_gov = forms.NullBooleanField('Anti Government') 
    presence = forms.NullBooleanField('Presence') 
    intervene = forms.NullBooleanField('Intervention') 
    brutality = forms.NullBooleanField('Brutality') 
    arrests = forms.NullBooleanField('Arrests') 
    issue = forms.CharField(max_length=100,required=False) 
    url = forms.CharField(max_length=100,required=False) 

    def __init__(self, data=None, *args, **kwargs): 
     super(CodingForm, self).__init__(data, *args, **kwargs) 

     if data and data.get('relevance', None) == True: 
      self.fields['event_date'].required = True 
      self.fields['location'].required = True 
      self.fields['anti_gov'].required = True 

在我看來,那時,我試圖讓形式和傳遞其價值觀的RelevanceCodingRecord兩個ModelForms和EventRecord並保存一切:

if request.method == 'POST': 
    if 'coding' in request.POST: 
    event_form = EventRecordForm(request.POST, prefix='event') 
    relevance_form = RelevanceCodingRecordForm(request.POST, prefix='event') 
    coding_form = CodingForm(request.POST, prefix='coding') 

    if coding_form.is_valid(): 
     obj = coding_form.save(commit=False) 
     event = event_form.save(commit=False) 
     relevance = relevance_form.save(commit=False) 

     # Relevance Data 
     relevance.relevance = obj.relevance 
     relevance.screened = True 
     relevance.classified = True 
     relevance.coder = request.user.coder 
     relevance.article = paginator.page(page).object_list[0] 
     relevance.last_updated = datetime.datetime.today 
     relevance.save() 

     if relenvace.relevance == True: 
     # Event Data 
      event.article = paginator.page(page).object_list[0] 
      event.event_date = obj.event_date 
      event.country = paginator.page(page).object_list[0].country 
      event.location = obj.event_location 
      event.actors = obj.actors 
      event.party = obj.party 
      event.labor_org = obj.labor_org 
      event.property_dmg = obj.property_dmg 
      event.violence = obj.violence 
      event.injured = obj.injured 
      event.deaths = obj.deaths 
      event.participants_num = obj.participants_num 
      event.participants_str = obj.participants_str 
      event.anti_gov = obj.anti_gov 
      event.presence = obj.presence 
      event.intervene = obj.intervene 
      event.brutality = obj.brutality 
      event.arrests = obj.arrests 
      event.issue = obj.issue 
      event.url = paginator.page(page).object_list[0].source 
      event.coder = request.user.coder 
      event.last_updated = datetime.datetime.today 
      event.save() 

      redirect_to = "?page=%s" % page 
      return HttpResponseRedirect(redirect_to) 
     else: 
      redirect_to = "?page=%s" % page 
      return HttpResponseRedirect(redirect_to) 

else: 
    coding_form = CodingForm(prefix='coding') 
    coding_form.fields["location"].queryset = Location.objects.filter(ccode=country).order_by('name') 

但是,這不起作用:沒有記錄在我的數據庫中創建,我只得到重定向。
有沒有一種方法可以完成這項工作?或者我在這裏是一個傻瓜差事?
從一種形式傳遞到另一種形式的大部分數據也不是DRY,但我不知道更好的方法。

任何幫助這裏非常感謝!

+0

當你說它不起作用時會發生什麼? – maulik13

+0

我得到重定向(我應該),但是沒有在數據庫中創建的RelevanceCodingRecords或EventRecords。 – LukasKawerau

+1

我不知道調用coding_form.save(),因爲這不是ModelForm,並且沒有與任何模型鏈接。你可以嘗試使用coding_form.cleaned_data字典中所有來自coding_form的值嗎? – maulik13

回答

1

由於coding_form不是ModelForm的實例,因此coding_form.save()將不起作用並且不會返回模型實例。您可以使用coding_form.cleaned_data字典訪問表單數據。

相關問題