1

我在djangos 设计选择中遇到问题,不允许在模板中进行模型过滤。实际上,我确实理解它的意义,我真的不想打破它,但目前我看不出什么是最好或通常的方法来规避我的情况。

我有一个带有另一个模型Task的外键的模型。现在我正在遍历所有任务,如果用户已经有了这个任务的解决方案,我想同时显示一个勾号和他的解决方案的链接。有点像这样:user_solutionsSolution

{% for task in tasks %}
    {{ task.title }}
    {% if task.user_solutions.filter(author=author).count() > 0 %}
        Tick!
        {{ task.user_solutions.get(author=author).get_absolute_url }}
    {% endif %}
{% endfor %}

是的,为相同的信息查询数据库两次看起来很残忍,而 django 模板不接受这样的(正确)。

但是,其他方法似乎也不起作用:

  • 我无法添加方法Task.get_current_user_solution(),因为在模型中我不知道哪个用户已登录
  • 我无法添加方法Task.get_user_solution(user),因为我无法通过模板传递参数
  • 我不能在视图中查询信息并将其保存到字典current_users_solutions中(Task.id作为索引),因为在模板中,我不能使用组合变量来访问字典(访问它的索引当然是task.id

那我还能做什么呢?从链接的文章中我只能看到我可以添加一个新的模板标签以允许从模板中查询,但如前所述,如果可能的话,我实际上想遵循 djangos 的设计原则。

4

3 回答 3

2

执行此操作的 Django 方法是创建一个自定义模板标记,该标记接受用户参数并适当地过滤查询集。这只是几行代码。

Django 对“模板中没有逻辑”并不教条(教条主义在 Python 中通常是不受欢迎的,也就是“实用性胜过纯洁性”)。它不提供在模板语言中本地执行此类操作的能力,但这就是它完全具有自定义模板标签的原因:如果您的设计需要它,最简单的方法是从模板中查询,那么这就是你应该做的。

于 2013-07-04T21:01:58.683 回答
1

您可以在视图中添加任何您想要的任务,因此,在 views.py 中,您可以执行以下操作:

# in views.py
for task in tasks:
    if task.user_solutions.filter(author=author).count() > 0:
        task.is_this_users = True
        task.url = task.user_solutions.get(author=author).get.absolute_url

然后在您的模板中:

{% for task in tasks %}
    {{ task.title }}
    {% if task.is_this_users %}
        Tick!
        {{ task.url }}
    {% endif %}
{% endfor %}
于 2013-07-05T06:53:22.323 回答
0

你可以像这样使用 django 模板标签: templatetags.py @register.inclusion_tag("template.html") def task_def(request): task = user_solutions.filter(author=author).count() if task >0: task. is_this_users = True task_url = task.user_solutions.get(author=author).get.absolute_url return {'task_url': task_url}

在模板文件 (.html) {% load templatetags %} 中,现在您可以在这里使用您的返回结果,就像您想要 {% for element in task_url %}

于 2013-07-05T07:43:46.187 回答