2013-06-21 106 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字典访问表单数据。

相关问题