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 中使用基于类的视图重定向条件?