同じ基本クラスから継承したモデルのセットのフォームを処理するために汎用のCreateViewクラスを使用しようとしています。Django:パラメトリッククラスベースのビュー
class BaseContent(models.Model):
...
class XContent(BaseContent):
...
class YContent(BaseContent):
...
DRYを維持するために、BaseContentのすべての継承クラスを処理するCreateViewクラスを1つ定義します。
そのビューの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()
をオーバーライドしようとしましたが、この方法ではrequest
パラメータを受け入れることも、URLパターンに由来するself.model_name
にアクセスすることもできません。
URLから渡されたパラメータに基づいてCreateViewで動的フォームを使用するにはどうすればよいですか?
ありがとうございました。
:あなたは、as_view(で定義されている発送方法、)(django.views.generic.base)をオーバーライドするために、このようなものが必要get_queryset()メソッドの中で.requestとself.model_name。その考えをしなかった。 – bmihelac
はい、CreateViewの祖先であるViewクラスは、URLからのkwargsをインスタンス変数として設定します。 'self.model_name'は' self.request'が他のmixinから来ているので、 'get_queryset()'にアクセスできません。私がモデル名を 'get'パラメータとして渡すと、私は自分が望むことをすることができますが、うまくいかないでしょう。クラスベースのビューとドキュメントの不足で継承とミックスインが編成される方法は、クラスのメソッドと属性をトレースすることを非常に複雑にします。 – omat
それぞれのモデルのフォームクラスを作成し、 'ModelFormMixin'のget_form_classメソッドをオーバーライドして、要求パラメータに基づいてビューの関連フォームを取得することはできませんか?最後の手段として – vimukthi