我在 Django 1.5 应用程序中有一组相关模型:Events
具有EventSessions
,EventSessionRegistrations
属于EventSessions
.
我正在努力为面向用户的注册表单创建一个基于类的通用视图,用户在其中注册以参加EventSession
. 具体来说,问题在于排除EventSession
在表单中呈现注册的字段,同时仍根据上下文和/或 URL 设置该值。
我将首先尝试通过一个用例进行解释:
- 用户去了
'/events/foo/bar'
,foo
是Event
,bar
是EventSession
。 - 在这个 URL 上,有一个注册 的链接
EventSession
,指向'/events/foo/bar/register/'
. 显示模型的表单EventSessionRegistration
,但未EventSession
在 UI 中选择 ,因为该信息已由 URL“设置”。 - 成功提交表单后,用户被重定向到静态“感谢”页面。
为了实现这一点,我有以下视图代码(许多其他导入等除外):
from django.views.generic.edit import CreateView
class RegistrationCreate(CreateView):
form_class = SessionRegistrationForm
success_url = '/thanks/'
template_name = 'events/registration_create.html'
def get_context_data(self, *args, **kwargs):
"""Set the context of which Event, and which EventSession.
Return 404 if either Event or EventSession is not public."""
context = super(RegistrationCreate, self).get_context_data(**kwargs)
s = get_object_or_404(
EventSession,
event__slug=self.kwargs['event_slug'],
event__is_public=True,
slug=self.kwargs['session_slug'],
is_public=True)
context['session'] = s
context['event'] = s.event
return context
此视图的 URL 模式(包含在 base 中urls.py
):
url(r'^(?P<event_slug>[\w-]+)/(?P<session_slug>[\w-]+)/register/$',
RegistrationCreate.as_view(), name="event_session_registration"),
在 ModelForm 中,我尝试将session
EventSessionRegistration 字段(指向EventSession
)上的 ForeignKey 转换为显示HiddenInput()
-widget:
class SessionRegistrationForm(forms.ModelForm):
class Meta:
model = EventSessionRegistration
widgets = {
'session': HiddenInput()
}
但是我仍然不知道如何将该字段的初始值设置为'session'
我设置的值的 id get_context_data
。我试过self.initial = {'session': s.id}
在里面设置get_context_data
,但我猜这个initial
属性已经被用来构造表单了。
关于实现这一目标的最佳方法的任何想法?我错过了什么?