Мне неясно, как лучше всего получить доступ к параметрам URL в представлениях на основе классов в Django 1.5.
Обратите внимание на следующее:
Посмотреть:
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
})
Как лучше всего получить доступ к параметру url в CBV, подобном приведенному выше, который является подклассом, TemplateView
и где в идеале следует разместить подобную логику, например. в методе?
extra_context
диктаdjango2
, см. ЗдесьОтветы:
Чтобы получить доступ к параметрам URL-адреса в представлениях на основе классов, используйте
self.args
илиself.kwargs
чтобы получить к нему доступ, выполнивself.kwargs['year']
источник
year = self.kwargs['year']
вид, я получаюNameError: self not defined
.NameError
, что вы пытаетесь сделатьyear = self.kwargs['year']
? Вы должны делать это в методе, вы не можете сделать это на уровне класса. Так, например, вы используете,TemplateView
что означает, что вы будете выполнять логику в своемget_context_data
переопределении.def __init__(self):
функции класса, если хотите получить к нему доступ вне других функций.Если вы передаете параметр URL следующим образом:
Вы можете получить к нему доступ в представлении на основе классов, используя
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)
источник
qs=<Object>.objects.<method>
Я нашел это элегантное решение и для django 1.5 или выше, как указано здесь :
В вашем 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)
Решение по отправке, найденное в этом вопросе .
По мере того как вид уже пройдена в контексте шаблона, вы действительно не нужно беспокоиться об этом. В вашем файле шаблона Annual.html можно получить доступ к этим атрибутам представления просто:
Вы можете оставить свой urlconf как есть.
Стоит упомянуть, что получение информации в контексте вашего шаблона перезаписывает get_context_data (), поэтому это каким-то образом нарушает поток bean-компонентов действия django .
источник
До сих пор я мог получить доступ к этим параметрам url только из метода get_queryset, хотя я пробовал это только с ListView, а не TemplateView. Я использую параметр 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']
? Он должен быть доступен где угодно в классе.Как насчет использования декораторов Python, чтобы сделать это понятным:
class Yearly(TemplateView): @property def year(self): return self.kwargs['year']
источник