python - 用于过滤和检查该模型中是否存在相关数据的 Django 模板语法/标签

标签 python django django-templates

我正在使用 python-3.6.4 和 django-2.0.2 开发一个项目。为了简单起见,我简短地解释一下情况。假设有三个应用程序:“problems”、“solve_activities”和“profiles”,其中包含三个模型(如下所述)。我对每个问题都有一个“DetailView”页面。我想显示登录用户是否解决了问题。

我想要使用的 django 模板标签是这样的:

{% if user.is_authenticated and problem.solved.all.filter(solver={{user.username}}) %}

以下是上述文件:

“问题/models.py”:

class Problem(models.Model):
  name = models.CharField(max_length=20)
  slug = models.SlugField(allow_unicode=True, max_length=100, unique=True)

  def __str__(self):
    return self.name

  def get_absoulte_url(self):
    return reverse('problems')
    return reverse('problems:problem_detail', kwargs={'slug':self.slug})

我在“problems/urls.py”中使用了 urlpatterns 作为“path('/',views.ProblemDetail.as_view(),name='problem_detail')”。

“profiles/models.py”(继承自auth.models.User):

class User(auth.models.User, auth.models.PermissionsMixin):
def __str__(self):
    return self.username

“solve_activities/models.py”:

class Solve(models.Model):
  problem = models.ForeignKey(Problem, on_delete=models.CASCADE, related_name="solved")
  solver = models.ForeignKey(User, on_delete=models.CASCADE, related_name="solved")

我仅在用户解决问题时创建此对象。

现在,我对 issues/views.py 的 ProblemDetail View :

class ProblemDetail(generic.DetailView):
  model = Problem
  template_name = 'problems/problem_detail.html'

以及“problems/problem_detail.html”文件,我基本上面临着复杂性:

<h1>{{problem}}</h1>
<h4>Solve Status: {% if user.is_authenticated and problem.solved.all.filter(solver={{user.username}}) %}Solved{% else %}Unsolved{% endif %}</h4>

再说一遍,

{% if user.is_authenticated and problem.solved.all.filter(solver={{user.username}}) %}

这就是我想做的,但我找不到任何有用的资源来指导如何正确地做到这一点。

它引发的错误是:

TemplateSyntaxError at /problems/timus-1000/
Could not parse the remainder: '(solver={{user}})' from 'problem.solved.all.filter(solver={{user}})'

最佳答案

不要在模板中执行逻辑,这就是 View 的用途。将其添加到上下文中并在模板中使用它。

class ProblemDetail(generic.DetailView):
    ...
    def get_context_data(self, *args, **kwargs):
        context = super(ProblemDetail, self).get_context_data()
        context["solve_status"] = self.request.user.is_authenticated and context["object"].solved.filter(solver=self.request.user).exists()
        return context

然后在模板中使用

{% if solve_status %} ..

关于python - 用于过滤和检查该模型中是否存在相关数据的 Django 模板语法/标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49140849/

相关文章:

python - 获取python中两个日期之间的所有年份

Python namedtuple 作为 apply_async(..) 回调的参数

python - 添加时的 Django 管理模型无法呈现相关的更改链接

python - Apache 中的配置错误

django - 如何获取 Django 模板中定义的所有变量?

python - 递归类型注释

python - Django、Ajax + 通用外键

python - 如何使用 Django Rest Framework 序列化通用关系

Django 重定向到上一个 View

python - 在网站文件中消失 {% csrf_token %}