Python Django类视图中的URL参数和逻辑(TemplateView)

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

我不清楚在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
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选项,我喜欢这个。该属性是可重用的。