【问题标题】:passing value to get_context_data from Django template从 Django 模板将值传递给 get_context_data
【发布时间】:2018-02-12 21:37:10
【问题描述】:

我正在处理与特定模型关联的 Django 模板。在此模板的视图中,我正在尝试根据我将在模板中传递的参数访问来自不同模型(包含科学术语的术语)的记录。

我尝试使用get_context_data 来查询数据库中的随机术语,然后使用自定义过滤器标记将术语替换为模板中我想要的术语。 Django 更聪明,但不会让我这样做。

目前,我正在尝试在 views.py 中定义上下文

class ArticlesView(DetailView):
    model = models.Articles
    template_name = 'web/articles-details.html'
    context_object_name = 'Articles_details'

    def get_context_data(self, *args, **kwargs):
        ctx = super(ArticlesView, self).get_context_data(*args, **kwargs)
        ctx['featured'] = Articles.objects.filter(featured=True)
        ctx['term','arg'] = Articles.objects.filter('slug'=='arg')
        return ctx

在上面的代码中,“特色”上下文工作正常,但不是“术语”上下文。这显然是错误的;我知道......但我无法弄清楚正确的语法是什么,以及如何从模板中提供参数。 (在这个例子中,我试图只打印出“科学术语”的片段)。

有什么想法吗?

我知道我可以在我的模型中设置ForeignKey 来连接它们。问题是我在任何给定页面上至少有 4-5 个“科学术语”,因此,我必须为每个页面添加至少 5 个相关术语,然后以特定方式添加它们。 . 很多重复和混乱。

提前感谢您的帮助。

【问题讨论】:

    标签: django django-models django-templates django-views


    【解决方案1】:

    您对上下文所做的操作可能不会像您想象的那样有效。说明您使用该上下文字典所做的工作;

    >>> context = dict()
    >>> context['slug', 'arg'] = 'test'
    >>> context
    {('slug', 'arg'): 'test'}
    >>> context['slug']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'slug'
    >>> context['arg']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'arg'
    >>> context['slug', 'arg']
    'test'
    

    因此,如果您在模板中执行 {{ slug, arg }} 之类的操作,您将获得您的对象,但我认为这在模板语法中无效。

    所以根据你所拥有的,我怀疑你想做类似的事情;

    arg = 'my-slug'
    ctx['term'] = Articles.objects.filter(slug=arg)
    ctx['arg'] = arg
    

    这将为您提供 arg 用于匹配 Articles 模型上的 slug 与分配给 term 的查询集。

    【讨论】:

    • 谢谢,马克。解释确实有助于理解。在您建议的方法中,我将如何从模板中调用它?说我要使用的蛞蝓是“大脑”。我会在我的模板中使用{{ brain, arg }}arg = 'brain' 吗?还是别的什么?
    • @RaghavSuri 老实说,我真的不明白您为什么要尝试分配两个变量 (ctx['term','arg']),所以我建议将其简化为 ctx['term']ctx['arg']。避免使用ctx['term','arg'],因为这可能不是您想要做的。
    猜你喜欢
    • 2013-07-29
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2018-10-18
    • 2019-04-03
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多