Django 基础知识:如何使用基于类的视图呈现上下文

Posted

技术标签:

【中文标题】Django 基础知识:如何使用基于类的视图呈现上下文【英文标题】:Django basics: how to render a context with a class based view 【发布时间】:2013-06-25 12:52:59 【问题描述】:

我的“Note”模型有一个名为“tags”的字符域。我想获取 Note.tags 字符串并将其呈现为 .我有一个方法可以给我一个 python 列表,我有点希望我可以在模板中使用表单方法“.as_ul”。但我似乎无法将变量放入模板中。这是我正在尝试的:

我的视图类:

import string
...

class NoteDetailView(generic.DetailView):
    model = Note
    template_name = 'note_taker/note'

    def tag_string_to_list(self):
        tag_string = Note.tags
        tag_list = string.split(tag_string)
        return render(template_name, Context('tag_list':tag_list, note_taker))

我的模板:

<ul>
   tag_list.as_ul 
</ul>

即使我对如何使用“.as_ul”有误,我什至无法使用 tag_list

呈现列表

我想我不明白视图方法是如何工作的。

【问题讨论】:

【参考方案1】:

使用get_context_data 方法。

class NoteDetailView(generic.DetailView):

    def get_context_data(self, **kwargs):
        context = super(NoteDetailView, self).get_context_data(**kwargs)
        context['tag_list'] = Note.tags.split()
        return context

在模板中,您将无法使用.as_ul,但有一个内置过滤器unordered_list 可能会满足您的需求:

<ul>
     tag_list|unordered_list 
</ul>

尽管您确实应该考虑定义一个独立的Tag 模型并使用多对多关系而不仅仅是一个字符字段。这是多对多关系的经典示例之一。或者使用第三方 Django 标记包之一。

【讨论】:

谢谢!是的,我最终会制作一个 Tag 模型,但我想先解决这个问题,因为它困扰着我。【参考方案2】:

我总是使用 Django 的标准 ContextMixin。它确保视图对象在模板中作为view 可用。

所以视图变得像

class NoteDetailView(generic.ContextMixin, generic.DetailView):
    model = Note
    template_name = 'note_taker/note'

    def tag_string_as_list(self):
        return Note.tags.split()

在你做的视图中:

<ul> view.tag_string_as_list </ul>

【讨论】:

以上是关于Django 基础知识:如何使用基于类的视图呈现上下文的主要内容,如果未能解决你的问题,请参考以下文章

使用基于类的 UpdateView 在 Django 中更新用户模型

如何在 Django 1.3 中使用基于类的视图重定向条件?

Django中基于类的视图上带有参数的函数装饰器

如何正确使用 % include % 标签在 django 中呈现模板(如部分)?

使用基于类的视图和 ajax 的 Django 应用程序?

如何在 django 中使用基于类的视图