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

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있으며 이상적으로 이와 같은 논리를 어디에 배치해야합니까? 방법으로?



답변

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


답변

다음과 같은 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)


답변

나는이 우아한 해결책을 찾았고 여기에서 지적한 것처럼 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의 액션 빈 흐름을 있습니다.


답변

지금까지는 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


답변

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

class Yearly(TemplateView):

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


답변