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

时间:2013-06-27 20:55:49

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

我的'Note'模型有一个名为'tags'的Charfield。我想取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}}呈现列表

我想我不理解视图方法是如何工作的。

2 个答案:

答案 0 :(得分:0)

使用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模型并使用多对多关系而不仅仅是char字段。这是多对多关系的典型例子之一。或者使用第三方Django标记包之一。

答案 1 :(得分:0)

我总是使用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>