好吧,我卡住了。通過中間形式保存到兩個模型 - Django
我現在的問題如下: 我有兩個型號,RelenvaceCodingRecord
和EventRecord
。
用戶應該能夠選擇文章是否相關。如果是,則表單中的其他字段應該是必需的,如果不是,則不需要字段。 這必須發生在同一頁上的一種形式,沒有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,但我不知道更好的方法。
任何幫助這裏非常感謝!
當你說它不起作用時會發生什麼? – maulik13
我得到重定向(我應該),但是沒有在數據庫中創建的RelevanceCodingRecords或EventRecords。 – LukasKawerau
我不知道調用coding_form.save(),因爲這不是ModelForm,並且沒有與任何模型鏈接。你可以嘗試使用coding_form.cleaned_data字典中所有來自coding_form的值嗎? – maulik13