Python Django类视图中的URL参数和逻辑(TemplateView)
我不清楚在Django 1.5中如何最好地访问基于类的视图中的URL参数 考虑以下几点: 查看:Python Django类视图中的URL参数和逻辑(TemplateView),python,django,django-class-based-views,Python,Django,Django Class Based Views,我不清楚在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 = datetim
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
from .views import Yearly
urlpatterns = patterns('',
url(
regex=r'^(?P<year>\d+)/$',
view=Yearly.as_view(),
name='yearly-view'
),
)
URLCONF:
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
from .views import Yearly
urlpatterns = patterns('',
url(
regex=r'^(?P<year>\d+)/$',
view=Yearly.as_view(),
name='yearly-view'
),
)
如何最好地访问上述CBV中的url参数(该参数属于
TemplateView
的子类),以及理想情况下应将此类逻辑放置在何处,例如在方法中?要在基于类的视图中访问url参数,使用self.args
或self.kwargs
这样您就可以通过执行self.kwargs['year']
来访问它了。到目前为止,我只能从get\u queryset方法中访问这些url参数,尽管我只使用了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
如果您像这样传递URL参数:
http://<my_url>/?order_by=created
我发现了这个优雅的解决方案,对于django 1.5或更高版本,正如所指出的: Django的基于类的通用视图现在自动包含一个视图 上下文中的变量。此变量指向视图对象 在your 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)
在此中找到了调度解决方案。由于已经在模板上下文中传递了,所以您不必担心它。在模板文件yearly.html中,可以通过以下方式访问这些视图属性:
{{ view.year }}
{{ view.current_year }}
{{ view.current_month }}
您可以保持urlconf的原样
值得一提的是,将信息获取到模板的上下文中会覆盖get_context_data(),因此它在某种程度上破坏了django的动作bean流。如何使用Python装饰程序使其易于理解:
class Yearly(TemplateView):
@property
def year(self):
return self.kwargs['year']
是否正确理解了我不应该像上面那样直接在视图中创建变量?(关于他们的坚持)。我也不明白我应该把上面的逻辑放在哪里,例如,用哪种方法?另外,当我在视图中执行
year=self.kwargs['year']
时,我会得到NameError:self not defined
。从技术上讲,您不应该这样做,因为它们是类级别的,并且是类变量。至于namererror
,您想在哪里执行year=self.kwargs['year']
?你应该在一个方法中做,你不能在类级别做。例如,您使用的是TemplateView
,这意味着您将在get_context_data
覆盖中执行逻辑。仅供参考:有关self.request、self.args等的文档可以在中找到,您也可以在def\uu init\uuu(self)中执行此操作:
类中的函数,如果您想在其他函数之外访问它。我发现很奇怪,当您尝试执行context['year']=self.kwargs['year']
时是否有错误或其他什么?它应该可以在类中的任何地方访问。@Ngenator:我刚刚设置了一个干净的django项目来进行双重检查,结果证明您是正确的。我不确定是什么在我的原始代码中阻止了这一点,但我会发现:)。谢谢你的捧场!这让我很困惑。。。我一直在读一些暗示HTTP参数将在kwargs中的东西。你能显示MyClassBasedView超类的get_queryset()吗?我只想做qs=.objects。
在django2
中有一个简单的extra\u上下文
dict选项,我喜欢这个。该属性是可重用的。