Django 模板中的 IF 条件语句不起作用
IF conditional statement in Django template does not work
{% if user.resume %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% else %}
<p>More information here</p>
{% endif %}
models.py
from django.db import models
from users.models import User
class Resume(models.Model):
name = models.CharField(max_length=255, blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name
views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required()
def my_resumes(request):
return render(request, 'resumes/myresumes.html')
如果用户没有简历,我正在尝试放置一个空状态。 Else,我想显示其他信息。我似乎无法让它工作。我想我在模板中使用了错误的 if
条件语句。
您需要重命名简历中的反向关系 class,以便您可以使用 {{ user.resume }} 访问它。
默认情况下,可以使用 user.resume_set 访问您定义的从简历到用户的外键关系。有关详细信息,请参阅 the docs。
我猜您只想让每个用户拥有一份简历,因此您可能希望使用 OneToOneField 而不是 ForeignKey。
class Resume(models.Model):
name = models.CharField(max_length=255, blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="resume")
def __str__(self):
return self.name
此外,您的 if 似乎绕错了方向,因为您可能希望在简历不存在时显示该表单。
{% if user.resume.exists %}
<p>More information here</p>
{% else %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% endif %}
首先,您的病情似乎转错了方向。您在 if user.resume
语句中处理简历不存在的情况的代码。所以它应该是 if not user.resume
.
其次,反向关系不是命名为user.resume
而是命名为user.resume_set
。如果需要,您可以使用 related_name
更改此名称。例如:user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='resumes')
可以通过 user.resumes
而不是 user.resume_set
.
访问它
然而,if user.resume_set
将始终被评估为 if True
,因为它是相关管理器,而不是查询集。所以你可以这样做:
{% if not user.resume_set.exists %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% else %}
<p>More information here</p>
{% endif %}
但是,在您的 else
语句中,您可能会使用类似 {% for resume in user.resume_set.all %}
的内容遍历简历。在这种情况下,您将访问数据库两次。一次为user.resume_set.exists
,一次为user.resume_set.all
,这是不需要的,因为你可以从user.resume_set.all
的结果中知道user.resume_set.exists
的结果。 Django 模板允许您在迭代对象时执行类似这样的操作来处理空大小写:
{% for resume in user.resume_set.all %}
Your code to display a resume item here
{% empty %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% endif %}
但是,在模板中执行查询集仍然不是很好的做法。为避免这种情况,您可以在视图中传递它:
@login_required()
def my_resumes(request):
context = {'resumes': request.user.resume_set.all()}
return render(request, 'resumes/myresumes.html', context)
现在你可以做:
{% for resume in resumes %}
Your code to display a resume item here
{% empty %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% endif %}
注意你也可以使用之前的语法,它只会命中数据库一次:
{% if not resumes %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% else %}
<p>More information here</p>
{% for resume in resumes %}
Your code to display a resume item
{% endfor %}
{% endif %}
{% if user.resume %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% else %}
<p>More information here</p>
{% endif %}
models.py
from django.db import models
from users.models import User
class Resume(models.Model):
name = models.CharField(max_length=255, blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name
views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required()
def my_resumes(request):
return render(request, 'resumes/myresumes.html')
如果用户没有简历,我正在尝试放置一个空状态。 Else,我想显示其他信息。我似乎无法让它工作。我想我在模板中使用了错误的 if
条件语句。
您需要重命名简历中的反向关系 class,以便您可以使用 {{ user.resume }} 访问它。
默认情况下,可以使用 user.resume_set 访问您定义的从简历到用户的外键关系。有关详细信息,请参阅 the docs。
我猜您只想让每个用户拥有一份简历,因此您可能希望使用 OneToOneField 而不是 ForeignKey。
class Resume(models.Model):
name = models.CharField(max_length=255, blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="resume")
def __str__(self):
return self.name
此外,您的 if 似乎绕错了方向,因为您可能希望在简历不存在时显示该表单。
{% if user.resume.exists %}
<p>More information here</p>
{% else %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% endif %}
首先,您的病情似乎转错了方向。您在 if user.resume
语句中处理简历不存在的情况的代码。所以它应该是 if not user.resume
.
其次,反向关系不是命名为user.resume
而是命名为user.resume_set
。如果需要,您可以使用 related_name
更改此名称。例如:user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='resumes')
可以通过 user.resumes
而不是 user.resume_set
.
然而,if user.resume_set
将始终被评估为 if True
,因为它是相关管理器,而不是查询集。所以你可以这样做:
{% if not user.resume_set.exists %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% else %}
<p>More information here</p>
{% endif %}
但是,在您的 else
语句中,您可能会使用类似 {% for resume in user.resume_set.all %}
的内容遍历简历。在这种情况下,您将访问数据库两次。一次为user.resume_set.exists
,一次为user.resume_set.all
,这是不需要的,因为你可以从user.resume_set.all
的结果中知道user.resume_set.exists
的结果。 Django 模板允许您在迭代对象时执行类似这样的操作来处理空大小写:
{% for resume in user.resume_set.all %}
Your code to display a resume item here
{% empty %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% endif %}
但是,在模板中执行查询集仍然不是很好的做法。为避免这种情况,您可以在视图中传递它:
@login_required()
def my_resumes(request):
context = {'resumes': request.user.resume_set.all()}
return render(request, 'resumes/myresumes.html', context)
现在你可以做:
{% for resume in resumes %}
Your code to display a resume item here
{% empty %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% endif %}
注意你也可以使用之前的语法,它只会命中数据库一次:
{% if not resumes %}
<div class="empty-state-box">
<img src="{% static 'resumes/images/resume-empty-icon.png' %}" class="centered">
<p class="empty-state-text"><b>You currently don't have any resumes.</b><br>Create one and
start building your very first resume</p>
</div>
{% else %}
<p>More information here</p>
{% for resume in resumes %}
Your code to display a resume item
{% endfor %}
{% endif %}