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']
답변
