カスタムクラスベースのビューがあります
# myapp/views.py
from Django.views.generic import *
class MyView(DetailView):
template_name = 'detail.html'
model = MyModel
def get_object(self, queryset=None):
return queryset.get(slug=self.slug)
このようにスラッグパラメータ(またはビューに他のパラメータ)を渡したい
MyView.as_view(slug='hello_world')
これを行うには、メソッドをオーバーライドする必要がありますか?
as_view
メソッドに渡されるすべてのパラメーターは、Viewクラスのインスタンス変数です。つまり、slug
をパラメーターとして追加するには、サブクラスでインスタンス変数として作成する必要があります。
# myapp/views.py
from Django.views.generic import DetailView
class MyView(DetailView):
template_name = 'detail.html'
model = MyModel
# additional parameters
slug = None
def get_object(self, queryset=None):
return queryset.get(slug=self.slug)
これでMyView.as_view(slug='hello_world')
が機能するはずです。
キーワードを介して変数を渡す場合は、エリクソン氏が提案したものを使用してください: https://stackoverflow.com/a/11494666/99
Urlconfが次のような場合:
url(r'^(?P<slug>[a-zA-Z0-9-]+)/$', MyView.as_view(), name = 'my_named_view')
スラグは、次のようにビュー関数(「get_queryset」など)内で使用できます。
self.kwargs['slug']
キーワードargとして渡されたスラッグに基づいてオブジェクトを検索するためにget_object()
をオーバーライドする必要がないことに注意してください-SingleObjectMixin
の属性を使用できます https: //docs.djangoproject.com/en/1.5/ref/class-based-views/mixins-single-object/#singleobjectmixin
# views.py
class MyView(DetailView):
model = MyModel
slug_field = 'slug_field_name'
slug_url_kwarg = 'model_slug'
context_object_name = 'my_model'
# urls.py
url(r'^(?P<model_slug>[\w-]+)/$', MyView.as_view(), name = 'my_named_view')
# mymodel_detail.html
{{ my_model.slug_field_name }}
(slug_field
とslug_url_kwarg
の両方がデフォルトで'slug'
になります)
テンプレートのコンテキストにオブジェクトを追加する場合は、get_context_data
をオーバーライドしてそのコンテキストに追加できます。リクエストは、request.userが必要な場合にselfの一部でもあります。
def get_context_data(self, **kwargs):
context = super(MyTemplateView, self).get_context_data(**kwargs)
if 'slug' in self.kwargs:
context['object'] = get_object_or_404(MyObject, slug=self.kwargs['slug'])
context['objects'] = get_objects_by_user(self.request.user)
return context
Urls.pyからパラメーターを渡すことができます https://docs.djangoproject.com/en/1.7/topics/http/urls/#passing-extra-options-to-view-functions
これは、汎用ビューでも機能します。例:
url(r'^$', views.SectionView.as_view(), { 'pk': 'homepage', 'another_param':'?'}, name='main_page'),
この場合、ビューに渡されるパラメーターは必ずしもViewクラスのインスタンス変数である必要はありません。このメソッドを使用すると、デフォルトのページ名をYourViewモデルにハードコーディングする必要はありませんが、urlconfからパラメーターとして渡すことができます。
Yaroslav Nikitenko で述べたように、Viewクラスに新しいインスタンス変数をハードコードしたくない場合、 ビュー関数に追加オプションを渡す from urls.py
このような:
url(r'^$', YourView.as_view(), {'slug': 'hello_world'}, name='page_name')
ビューからの使用方法を追加したかっただけです。次のいずれかの方法を実装できます。
# If slug is optional
def the_function(self, request, slug=None):
# use slug here
# if slug is an optional param among others
def the_function(self, request, **kwargs):
slug = kwargs.get("slug", None)
other_param = kwargs.get("other_param", None)
# If slug is required
def the_function(self, request, slug):
# use slug here