首页 文章

基于Django类的视图示例

提问于
浏览
1

我无法理解基于类的视图,所以我试图通过一个例子来解决它 . 这是我到目前为止:

#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)

所以,我现在想做的是:

  • 创建一个 class BaseView (或者你想调用它),它扩展了 django.generic.views 的某些内容,它将根据 langcode 输入参数确定上下文的 languagelanguages 参数

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

  • 我将进一步有另一个基于类的视图,也是为了扩展 BaseView ,它与 AboutView 相似,但是它还根据 langcode 输入参数设置了一个名为 region 的上下文参数 .

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

1 回答

  • 2

    这是实现您想要的简单方法:

    首先使用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
    

    希望有所帮助!

相关问题