IT story

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

hot-time 2020. 9. 8. 21:58
반응형

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

In this case the parameters passed to the view should not necessarily be instance variables of the View class. Using this method you don't need to hardcode default page name into YourView model, but you can just pass it as a parameter from urlconf.


As stated by Yaroslav Nikitenko, if you don't want to hardcode a new instance variable to the View class, you can pass extra options to view functions from urls.py like this:

url(r'^$', YourView.as_view(), {'slug': 'hello_world'}, name='page_name')

I just wanted to add how to use it from the view. You can implement one of the following methods:

# 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

참고URL : https://stackoverflow.com/questions/11494483/django-class-based-view-how-do-i-pass-additional-parameters-to-the-as-view-meth

반응형