我有一個Workshop
Django應用程序。每個Workshop
可以有多個與會者通過相關的WorkshopAttendee
模型(簡化如下)。我使用Django的ModelForm
在基於類的視圖,並在forms.py
我使用crispy-forms:Django ModelForms:在表單中嵌入FK相關字段
models.py(相關部分)
class Workshop(models.Model):
title = models.CharField(max_length=100)
information = models.TextField()
location = models.TextField()
class WorkshopAttendee(models.Model):
workshop = models.ForeignKey(Workshop)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
views.py(相關部分)
from django.views.generic.edit import FormView
from workshop.forms import WorkshopAttendeeForm
class WorkshopAttendeeFormView(FormView):
def form_valid(self, form):
# Clean the data
form_data = form.cleaned_data
form.save(commit=False)
return super(WorkshopAttendeeFormView, self).form_valid(form)
forms.py
from django.forms import ModelForm
from workshop.models import WorkshopAttendee
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, HTML, Field, \
Fieldset, Button, Hidden, Submit, Reset
from crispy_forms.bootstrap import FormActions
# Create the form class
class WorkshopAttendeeForm(ModelForm):
def __init__(self, *args, **kwargs):
# Crispy form Layouts, Fieldsets, etc
super(WorkshopAttendeeForm, self).__init__(*args, **kwargs)
class Meta:
model = WorkshopAttendee
urls.py(相關部分)
urlpatterns = patterns('',
url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<slug>[\w\-.]+)/(?P<action>[\w\-.]+)/$',
WorkshopAttendeeFormView.as_view(
form_class=WorkshopAttendeeForm,
success_url="success/",
template_name='workshop/workshop_registration.html',
), name='workshop-attendee-register'
),
url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<slug>[\w\-.]+)/$',
WorkshopDetailView.as_view(
context_object_name='workshop_detail',
queryset=Workshop.objects.select_related(),
template_name='workshop/workshop_detail.html',
), name='workshop-detail'
),
)
我的問題是,如何可以種子與workshop_id的形式(即FK關係)在一個隱藏的表單域?很明顯,因爲表格尚未提交,所以還沒有FK關係。但在URL中我有kwarg的Workshop
slu 012。我可以在每個車間基礎上將workshop_id
作爲Hidden()
香脆形式字段進行硬編碼,但這完全不合邏輯。有任何想法嗎?我不認爲我可以在urls.py的模型上使用select_related()
或prefetch_related()
方法,所以也許我必須以某種方式將兩種模型都以某種方式放入窗體視圖中?
我不覺得這是一種邊緣情況,我相信別人也有類似的應用程序工作流程。
在此先感謝。
UPDATE
經過進一步研究,似乎我能做到這一點,利用Django Formsets。不知道究竟如何......提示歡迎。
你得到了slu,子,對吧?你爲什麼不在視圖中使用它來保存任何東西之前獲得PK?爲什麼你需要通過你的形式? – Thomas
聽起來不錯。在我看來,究竟在哪裏使用?我需要在表單中傳遞PK,所以我知道'WorkshopAttendee'應用於哪個'Workshop'。那有意義嗎? – tatlar
我在我的'WorkshopAttendeeFormView'中創建了一個'get()'方法嗎?這似乎是這樣做的地方... – tatlar