我创建了一个模板,该模板显示循环中的项目。循环中有一个条件,但是除非明确指定,否则该条件不起作用。
{% extends 'blog/base.html' %}
{% block content %}
<h3>{{ user.username }}</h3>
{% for project in projects %}
{% if user.username == 'testuser' %}
<h5>{{ project.title }}</h5>
<p>{{ project.description }}</p>
<p>{{ project.objectives }}</p>
<pre>{{ project.score }}</pre>
<pre>{{ project.student_id }}</pre>
{% endif %}
{% endfor %}
{% endblock content %}
上面的代码可以正常工作,并返回分配给名为testuser的用户的记录。
但是,如果我编写如下代码,它将跳过所有记录
{% extends 'blog/base.html' %}
{% block content %}
<h3>{{ user.username }}</h3>
{% for project in projects %}
{% if user.username == project.student_id %}
<h5>{{ project.title }}</h5>
<p>{{ project.description }}</p>
<p>{{ project.objectives }}</p>
<pre>{{ project.score }}</pre>
<pre>{{ project.student_id }}</pre>
{% endif %}
{% endfor %}
{% endblock content %}
我已经添加了模型中的代码
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Projects(models.Model):
title = models.CharField(max_length=150)
description = models.TextField()
objectives = models.TextField()
score = models.IntegerField()
#file = models.FileField()
date_posted = models.DateTimeField(default=timezone.now)
student_id = models.ForeignKey(User,on_delete=models.CASCADE)
def __str__(self):
return self.title
答案 0 :(得分:1)
student_id
是User
对象,而不是 string ,因此在这里,您将字符串(username
)与{{1} }对象,以及名称为User
的{{1}}与字符串User
相同。
最优雅的解决方案可能是将用户与用户进行比较,所以:
'testuser'
因此,我们省略了'testuser'
,并将{% if user == project.student_id %}
对象与.username
对象进行比较。
注意:枚举(特别是在模板中,但也在Django层本身中)效率不高,您应进行以下查询: 为您进行过滤。
您可以使用以下方法过滤查询集:
您认为的User
仅获得登录用户所在的项目 学生。
注意:
User
通常不带有user_projects = Project.objects.filter(student_id=request.user)
后缀。 Django将自动添加一个名为ForeignKey
的额外字段, 存储外键引用的主键。毕竟, Django中的_id
将延迟加载相关对象。