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 %}