7

ジェネリックCreateViewクラスを使用して、同じ基本クラスから継承された一連のモデルのフォームを処理しようとしています。

class BaseContent(models.Model):
    ...

class XContent(BaseContent):
    ...

class YContent(BaseContent):
    ...

物事を乾いた状態に保つために、BaseContentから継承されたすべてのクラスを処理する1つのCreateViewクラスを定義したいと思います。

そのビューのURLパターンは次のとおりです。

url(r'^content/add/(?P<model_name>\w+)/$', ContentCreateView.as_view(), name='content_add')

このようなものが機能するはずです:

class ContentCreateView(CreateView):
    template_name = 'content_form.html'

    def get_model(self, request):
        # 'content' is the name of the application; model_name is 'xcontent', 'ycontent', ...
        return ContentType.objects.get_by_natural_key('content', self.model_name)

しかし、私はこの例外を受け取っています:

ContentCreateView is missing a queryset. Define ContentCreateView.model, ContentCreateView.queryset, or override ContentCreateView.get_object().

この提案は、のようなクラス属性を設定したり、生成されたモデルフォームを動的に維持しmodelたりするつもりがないため、当てはまらないようです。querysetのオーバーライドはget_object、オブジェクトの作成には関係がないようです。

オーバーライドしようとしget_queryset()ましたが、このメソッドはパラメーターを受け入れず、URLパターンからのrequestパラメーターにアクセスできません。self.model_name

簡単に言うと、URLから渡されたパラメータに基づいてCreateViewに動的フォームを使用させるにはどうすればよいですか?

ありがとう。

4

2 に答える 2

1

呼び出されるURLに応じて、modelから属性を設定できます。urls.py

url(r'^content/add/x/$', 
    ContentCreateView.as_view(model=XContent), name='x_content_add'),
url(r'^content/add/y/$', 
    ContentCreateView.as_view(model=YContent), name='y_content_add')

少し繰り返しているので完璧ではないことは認めますが、モデルによっては、同じビューに異なる名前を付けることができるという利点があります。それに加えて、オーバーライドと同様のことを行うこともできますform_class...

于 2011-06-27T19:34:02.297 に答える
1

しばらくの間この問題がありましたが、解決策を見つけました。as_view()(django.views.generic.base)で定義されているディスパッチメソッドを次のようにオーバーライドする必要があります。

class ContentCreateView(CreateView):    
    def dispatch(self, request, *args, **kwargs):
        for app in ['foo', 'bar']:
            model = models.get_model(app, kwargs['modelname'])
            if model:
                self.model = model
                break

        return super(GenericEdit, self).dispatch(request, *args, **kwargs)
    ...
    ...
于 2015-12-10T13:35:54.870 に答える