8

私がやろうとしているのは、機能ビュー用のDjangoボイラープレートです。ドキュメントにはテンプレートビューとリストビューの例が示されているため、ここでのヘルプは非常にありがたいですが、モデルベースのジェネリックビューについてはほとんど見つかりませんでした。ドキュメントに例がありませんか?

カレンダーのエントリを表すモデルがあります。エントリを所有する別のオブジェクト(ユーザーではない)への外部キーがあります。私がやりたいのは、エントリを作成し、エントリの外部キーが適切に設定されていることを確認してから、ユーザーを適切なカレンダーページに戻すことです。

ただし、クラスベースのジェネリックビューがURL引数を受け取る方法はわかりません。また、作成URLに最初に渡されたIDを再利用するようにsuccess_urlを設定する方法がわかりません。繰り返しになりますが、よろしくお願いします。

私が求めているのは、基本的に、次のクラスベースのジェネリックビューに相当するものです。

def create_course_entry(request, class_id):
'''Creates a general calendar entry.'''
if request.method == 'POST':
    form = CourseEntryForm(request.POST)
    if form.is_valid():
        new_entry = form.save(commit=False)
        new_entry.course = Class.objects.get(pk=class_id)
        new_entry.full_clean()
        new_entry.save()
        return HttpResponseRedirect('/class/%s/calendar/' % class_id)
else:
    form = CourseEntryForm()

return render_to_response('classes/course_entry_create.html',
        { 'class_id': class_id, 'form': form, },
        context_instance=RequestContext(request))
4

2 に答える 2

24

edit.CreateViewジェネリックビューをサブクラス化し、メソッドにクラス/コースを設定し、dispatch()メソッドをオーバーライドすることでこれを保存できますform_valid()

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.views.generic.edit import CreateView


class CourseEntryCreateView(CreateView):
    form_class = CourseEntryForm
    model = CourseEntry

    def dispatch(self, *args, **kwargs):
        self.course = get_object_or_404(Class, pk=kwargs['class_id'])
        return super(CourseEntryCreateView, self).dispatch(*args, **kwargs)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.course = self.course
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

をカスタマイズしていない場合はCourseEntryForm ModelFormform_classプロパティを省略できます。

残念ながら、メソッドを呼び出すことはできませんsuper()form_valid()メソッドの記述方法が原因で、オブジェクトが再度保存されることを意味します。

テンプレートコンテキストでClass(course?)インスタンスが必要な場合は、次のget_context_data()メソッドにこれを追加できます。

    def get_context_data(self, *args, **kwargs):
        context_data = super(CourseEntryCreateView, self).get_context_data(
            *args, **kwargs)
        context_data.update({'course': self.course})
        return context_data
于 2011-05-08T09:03:48.800 に答える
6

Matt Austinの答えの代わりに、get_formメソッドをオーバーライドすることもできます。

from django.shortcuts import get_object_or_404
from django.views.generic import CreateView

class CourseEntryCreateView(CreateView):
    form_class = CourseEntryForm
    model = CourseEntry

    def get_form(self, form_class):
        form = super(CustomCreateView, self).get_form(form_class)
        course = get_object_or_404(Class, pk=self.kwargs['class_id'])
        form.instance.course = course
        return form

このように、コンテキスト内.courseCourseEntryインスタンスと、POST時にフォームが保存されたときに作成されたインスタンスにあります。

于 2012-05-14T09:24:16.630 に答える