【问题标题】:Django basics: how to render a context with a class based viewDjango 基础知识:如何使用基于类的视图呈现上下文
【发布时间】: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 }}

呈现列表

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

【问题讨论】:

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


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多