[python] Django 클래스 기반 뷰 : as_view 메소드에 추가 매개 변수를 어떻게 전달합니까?

사용자 지정 클래스 기반보기가 있습니다.

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

이렇게하려면 메서드를 재정의해야합니까?



답변

urlconf가 다음과 같은 경우 :

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

그러면 다음과 같이보기 함수 (예 : ‘get_queryset’) 내에서 슬러그를 사용할 수 있습니다.

self.kwargs['slug']


답변

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


답변

get_object()키워드 인수로 전달 된 슬러그를 기반으로 객체를 조회하기 위해 재정의 할 필요가 없다는 점은 주목할 가치가 있습니다 . https://docs.djangoproject.com/en/1.5/ref/ 의 속성을 사용할 수 있습니다. SingleObjectMixin 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_fieldslug_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에서 매개 변수로 전달할 수 있습니다.


답변

에서 언급 한 바와 같이 야로슬라프 Nikitenko 당신이보기 클래스에 새로운 인스턴스 변수를 하드 코딩하지 않으려면, 당신은 수있는 기능을 볼 수있는 추가 옵션 통과 에서 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


답변

장고 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'),
]