【问题标题】:Django class based views example基于 Django 类的视图示例
【发布时间】:2014-07-04 22:34:13
【问题描述】:

我无法理解基于类的视图,所以我试图通过一个例子来弄清楚。这是我目前所拥有的:

#urls.py
url(r'^(?P<langcode>[a-zA-Z-]+/about/$', about, name='about')


#views.py
def about(request, langcode):
    languages = Language.objects.values_list('code', flat=True)
    language = get_object_or_404(Language, pk=langcode)
    return render(request, 'about.html', {
        'languages': languages,
        'language': language
    })

我还有一些其他功能视图,其中包含about 的前两行:

languages = Language.objects.values_list('code', flat=True)
language = get_object_or_404(Language, pk=langcode)

所以,我现在想做的是:

  1. 创建一个class BaseView(或者你想怎么称呼它)它扩展 来自django.generic.views 的东西,它将根据langcode 输入参数确定上下文的languagelanguages 参数

  2. 创建class AboutView(BaseView)(因此扩展BaseView),它将以某种方式定义要用于渲染的模板名称about.html

  3. 我将进一步拥有另一个基于类的视图,也扩展BaseView,它类似于AboutView,但它设置了一个名为region 的上下文参数,也取决于langcode 输入参数

有人能告诉我具体如何编码这些东西吗?谢谢

【问题讨论】:

    标签: django django-views django-class-based-views


    【解决方案1】:

    这里有一个简单的方法来实现你想要的:

    您首先定义通用逻辑,使用 TemplateView 通用视图:

    class MyBaseView(TemplateView):
        def dispatch(self, request, *args, **kwargs):
            # dispatch takes care of "reading" the parameters from the url
            self.language = get_object_or_404(Language, pk=kwargs.pop("langcode")) # I would use some kind of default value to prevent exception, but its up to your logic
            return TemplateView.dispatch(self, request, *args, **kwargs)
    
        def get_context_data(self, **kwargs):
            # get_context_data creates the context
            context = TemplateView.get_context_data(self, **kwargs)
            context.update({"language": self.language, 
                            "languages": Language.objects.values_list('code', flat=True)})
    
            return context
    

    然后,您甚至不需要 AboutView,因为您只想控制 template_name,所以在您的 urls.py 中:

    # in urls,py you can just use this, instead of defining an AboutView, you pass the template_name you want to use, this is sufficient because TemplateView expects a template_name attribute
    url('^(?P<langcode>[a-zA-Z]+)/about/$', MyBaseView.as_view(template_name="about.html"), name='about')
    

    最后,对于使用 region 的其他视图,您可以从 MyBaseView 继承,并添加所需的上下文:

    class AboutViewWithRegion(MyBaseView):
        def get_context_data(self, **kwargs):
            context = MyBaseView.get_context_data(self, **kwargs)
            context.update({"region": <<your logic here>>})
            return context
    

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 2015-05-08
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2018-05-14
      • 2014-02-21
      相关资源
      最近更新 更多