Django 클래스 기반 뷰 (TemplateView)의 URL 매개 변수 및 로직


94

Django 1.5의 클래스 기반 뷰에서 URL 매개 변수에 액세스하는 것이 가장 좋은 방법이 나에게 명확하지 않습니다.

다음을 고려하세요:

전망:

from django.views.generic.base import TemplateView


class Yearly(TemplateView):
    template_name = "calendars/yearly.html"

    current_year = datetime.datetime.now().year
    current_month = datetime.datetime.now().month

    def get_context_data(self, **kwargs):
        context = super(Yearly, self).get_context_data(**kwargs)
        context['current_year'] = self.current_year
        context['current_month'] = self.current_month
        return context

URLCONF :

from .views import Yearly


urlpatterns = patterns('',
    url(
        regex=r'^(?P<year>\d+)/$',
        view=Yearly.as_view(),
        name='yearly-view'
    ),
)

year내 뷰 에서 매개 변수에 액세스하고 싶으 므로 다음과 같은 로직을 수행 할 수 있습니다.

month_names = [
    "January", "February", "March", "April", 
    "May", "June", "July", "August", 
    "September", "October", "November", "December"
]

for month, month_name in enumerate(month_names, start=1):
    is_current = False
    if year == current_year and month == current_month:
        is_current = True
        months.append({
            'month': month,
            'name': month_name,
            'is_current': is_current
        })

위와 같은 CBV의 url 매개 변수에 가장 잘 액세스하는 방법은 위와 같이 하위 클래스가 TemplateView있으며 이상적으로 이와 같은 논리를 어디에 배치해야합니까? 방법으로?


에 간단한 extra_context사전 의 옵션이 django2있습니다. 여기를
Timo

답변:


113

클래스 기반 뷰에서 URL 매개 변수에 액세스하려면 self.args또는을 사용 self.kwargs하여 다음을 수행하여 액세스합니다.self.kwargs['year']


1
위와 같이 뷰에서 직접 변수를 생성해서는 안된다는 것이 올바르게 이해 되었습니까? (지속적인 것에 관한 것). 또한 위와 같은 논리를 어디에 배치 해야하는지 이해하지 못합니다. 어떤 방법으로? 또한 내가 year = self.kwargs['year']보기에서 할 때 나는 얻는다 NameError: self not defined.

2
기술적으로는 클래스 수준에 있고 클래스 변수이기 때문에해서는 안됩니다. 에 관해서는 NameError, 당신은 year = self.kwargs['year']무엇 을하려고합니까 ? 메서드에서해야합니다. 클래스 수준에서는 할 수 없습니다. 예를 들어 재정의 TemplateView에서 논리를 수행한다는 의미를 사용하고 get_context_data있습니다.
Ngenator 2013-04-02

4
그냥 참조를 위해 : self.request에 설명서를 self.args 등에서 찾을 수 있습니다 docs.djangoproject.com/en/1.10/topics/class-based-views/...
LShi

또한 def __init__(self):다른 함수 외부에서 액세스하려는 경우 클래스의 함수에서 수행 할 수 있습니다 .
Rahat Zaman

60

다음과 같은 URL 매개 변수를 전달하는 경우 :

http://<my_url>/?order_by=created

다음을 사용하여 클래스 기반보기에서 액세스 할 수 있습니다 self.request.GET( self.args또는에 표시되지 않음 self.kwargs).

class MyClassBasedView(ObjectList):
    ...
    def get_queryset(self):
        order_by = self.request.GET.get('order_by') or '-created'
        qs = super(MyClassBasedView, self).get_queryset()
        return qs.order_by(order_by)

4
감사! 이것은 나를 헷갈 리게했다 ... 나는 HTTP 매개 변수가 kwargs에있을 것이라는 것을 암시하는 것을 계속 읽고있다.
foobarbecue 2014 년

MyClassBasedView의 수퍼 클래스의 get_queryset ()을 표시 할 수 있습니까? 난 그냥 할 것 qs=<Object>.objects.<method>
티모

24

나는이 우아한 해결책을 찾았고 여기에서 지적한 것처럼 django 1.5 이상을 찾았 습니다 .

Django의 일반 클래스 기반 뷰는 이제 컨텍스트에 뷰 변수를 자동으로 포함합니다. 이 변수는보기 개체를 가리 킵니다.

views.py에서 :

from django.views.generic.base import TemplateView    

class Yearly(TemplateView):
    template_name = "calendars/yearly.html"
    # Not here 
    current_year = datetime.datetime.now().year
    current_month = datetime.datetime.now().month

    # dispatch is called when the class instance loads
    def dispatch(self, request, *args, **kwargs):
        self.year = kwargs.get('year', "any_default")

    # other code

    # needed to have an HttpResponse
    return super(Yearly, self).dispatch(request, *args, **kwargs)

여기에서 찾은 디스패치 솔루션 질문 입니다.
는 AS 뷰가 이미 템플릿의 컨텍스트 내에서 전달되는, 당신은 정말 그것에 대해 걱정할 필요가 없습니다. 템플릿 파일 yearly.html에서 다음과 같은 방법으로 이러한보기 속성에 액세스 할 수 있습니다.

{{ view.year }}
{{ view.current_year }}
{{ view.current_month }}

urlconf를 유지할 수 있습니다. 를 그대로 .

템플릿의 컨텍스트에 정보를 가져 오는 것은 get_context_data ()를 덮어 쓰므로 어떻게 든 django의 액션 빈 흐름을 있습니다.


8

지금까지는 get_queryset 메서드 내에서만 이러한 URL 매개 변수에 액세스 할 수 있었지만 TemplateView가 아닌 ​​ListView에서만 시도해 보았습니다. url 매개 변수를 사용하여 객체 인스턴스에 속성을 만든 다음 get_context_data에서 해당 속성을 사용하여 컨텍스트를 채 웁니다.

class Yearly(TemplateView):
    template_name = "calendars/yearly.html"

    current_year = datetime.datetime.now().year
    current_month = datetime.datetime.now().month

    def get_queryset(self):
        self.year = self.kwargs['year']
        queryset = super(Yearly, self).get_queryset()
        return queryset

    def get_context_data(self, **kwargs):
        context = super(Yearly, self).get_context_data(**kwargs)
        context['current_year'] = self.current_year
        context['current_month'] = self.current_month
        context['year'] = self.year
        return context

이상하다고 생각합니다. 시도 할 때 오류나 무언가가 context['year'] = self.kwargs['year']있습니까? 수업 중 어디에서나 액세스 할 수 있어야합니다.
Ngenator 2013-06-24

@Ngenator : 방금 깨끗한 django 프로젝트를 설정하여 다시 한 번 확인했는데 맞습니다. 내 원래 코드에서 이것을 막는 것이 무엇인지 확실하지 않지만 알아낼 것입니다 :).
미리 알려

7

이것을 이해하기 위해 파이썬 데코레이터를 사용하는 것은 어떻습니까?

class Yearly(TemplateView):

    @property
    def year(self):
       return self.kwargs['year']

난이게 좋아. 이 속성은 재사용이 가능합니다.
cezar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.