0

Django 1.5 アプリに一連の関連モデルがEventsありEventSessionsます。EventSessionRegistrationsEventSessions

私は、ユーザーが登録してEventSession. 具体的にはEventSession、コンテキストや URL に基づいてその値を設定しながら、登録対象のフィールドをフォームでレンダリングされないように除外することに問題があります。

最初にユースケースを介して説明しようとします:

  1. ユーザーは'/events/foo/bar'fooは 、Eventbarに移動しEventSessionます。
  2. この URL に、 に登録するためのリンクがありEventSessionます'/events/foo/bar/register/'EventSessionRegistrationモデルのフォームが表示されますがEventSession、その情報は URL によって既に「設定」されているため、UI で を選択しません。
  3. フォームの送信が成功すると、ユーザーは静的な「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_dataself.initial = {'session': s.id}内部get_context_dataで設定しようとしましinitialたが、その時点でフォームを構築するために属性が既に使用されていると思います。

これを達成するための最良の方法についてのアイデアはありますか? 私は何が欠けていますか?

4

1 に答える 1

2

そうです、同じ問題を扱っているこの質問を見つけました。ビューで次のオーバーライドされた事後関数になり、テンプレートの非表示フィールドにセッション ID を手動で出力しました。

def post(self, request, *args, **kwargs):
    self.object = None
    evt_session = get_object_or_404(
        EventSession, pk=int(self.request.POST['session']))
    form_class = self.get_form_class()
    form = self.get_form(form_class)

    form.instance.session = evt_session

    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(form)

また、ccbv.co.ukを見つけました。これは、CBV:s のすべてのメソッドと属性について調べるための優れたリソースであり、オーバーライドをどのように構成するかについてのガイダンスを提供してくれました。

于 2013-06-28T11:14:58.050 に答える