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
、その情報は URL によって既に「設定」されているため、UI で を選択しません。 - フォームの送信が成功すると、ユーザーは静的な「Thanks」ページにリダイレクトされます。
これを達成するために、私は次のビューコードを持っています(他の多くのインポートなどは除外されています):
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()
。
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
たが、その時点でフォームを構築するために属性が既に使用されていると思います。
これを達成するための最良の方法についてのアイデアはありますか? 私は何が欠けていますか?