110

カスタムクラスベースのビューがあります

# 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')

これを行うには、メソッドをオーバーライドする必要がありますか?

4

7 に答える 7

124

urlconfが次のようになっている場合:

url(r'^(?P<slug>[a-zA-Z0-9-]+)/$', MyView.as_view(), name = 'my_named_view')

次に、スラッグは次のようにビュー関数('get_queryset'など)内で使用可能になります。

self.kwargs['slug']
于 2012-07-15T18:54:02.867 に答える
101

メソッドに渡されるすべてのパラメーター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')です。

キーワードを介して変数を渡す場合は、Erikkson氏が提案したものを使用してください:https ://stackoverflow.com/a/11494666/9903

于 2012-07-15T19:04:13.840 に答える
19

get_object()キーワードargとして渡されたスラッグに基づいてオブジェクトを検索するためにオーバーライドする必要がないことに注意してください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'

于 2013-06-19T03:17:32.473 に答える
15

テンプレートのコンテキストにオブジェクトを追加する場合は、オーバーライドget_context_dataしてそのコンテキストに追加できます。request.userが必要な場合、リクエストは自己の一部でもあります。

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
于 2012-10-08T18:24:18.870 に答える
14

urls.pyhttps : //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からパラメーターとして渡すことができます。

于 2015-03-26T21:12:51.887 に答える
8

Yaroslav Nikitenkoが述べたように、新しいインスタンス変数をViewクラスにハードコーディングしたくない場合は、次のような関数を表示するための追加のオプションを渡すことができます。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
于 2015-05-12T19:53:23.690 に答える
4

django 3.0の場合、これが私にとってうまくいったことです:

# myapp/views.py
from django.views.generic import DetailView

class MyView(DetailView):
    template_name = 'detail.html'
    slug = None

    def get_object(self, queryset=None):
        self.slug = self.kwargs.get('slug', None)
        return queryset.get(slug=self.slug)

# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('slug/<slug:slug>/', views.MyView.as_view(), name='myview_by_tag'),
]
于 2020-05-27T15:46:34.300 に答える