6

魅力のように機能します:

MyCreateView(CreateView):
    template_name = "my_template_name"
    form_class = MyModelForm
    success_url = "/success/"

ただし、次の場合はそうではありません。

MyUpdateView(UpdateView):
    template_name = "my_template_name"
    form_class = MyModelForm
    success_url = "/success/"

次のエラーが表示されます。

MyUpdateView is missing a queryset. Define MyUpdateView.model, MyUpdateView.queryset, or override MyUpdateView.get_queryset().

なぜUpdateView必要なのかmodelquerysetまたはget_querysetエラーをCreateView引き起こさないように定義されているのか、そうではないのですか? ModelForm で使用されているモデルから自動的に派生できるはずではありませんか?

4

2 に答える 2

8

現在 (django 1.5.1 公式リリース)は、フォームにオブジェクトを提供できるようにUpdateView呼び出しています。self.get_object()instance

https://github.com/django/django/blob/1.5c2/django/views/generic/edit.py#L217から:

def get(self, request, *args, **kwargs):
    self.object = self.get_object()
    return super(BaseUpdateView, self).get(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    return super(BaseUpdateView, self).post(request, *args, **kwargs)

メソッドには、self.get_object宣言された次のプロパティのいずれかが必要です: modelquerysetまたはget_queryset

一方CreateView、電話しないでくださいself.get_object()

https://github.com/django/django/blob/1.5c2/django/views/generic/edit.py#L194から:

def get(self, request, *args, **kwargs):
    self.object = None
    return super(BaseCreateView, self).get(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
    self.object = None
    return super(BaseCreateView, self).post(request, *args, **kwargs)
于 2013-07-12T11:16:39.230 に答える