[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']