我有一个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