Django 1.5 アプリに一連の関連モデルがEventsありEventSessionsます。EventSessionRegistrationsEventSessions
私は、ユーザーが登録して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 で、sessionEventSessionRegistration フィールド (を指す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たが、その時点でフォームを構築するために属性が既に使用されていると思います。
これを達成するための最良の方法についてのアイデアはありますか? 私は何が欠けていますか?