如果Django模板中的条件语句不起作用

时间:2018-10-03 10:40:25

标签: django django-templates conditional

{% 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')

如果用户没有简历,我正在尝试 设置为空状态。 其他,我想显示其他信息。我似乎无法正常工作。我认为我在模板中使用了if条件语句错误。

2 个答案:

答案 0 :(得分:2)

首先,您的情况似乎转错了方向。您可以对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.exists的结果中知道user.resume_set.all的结果。 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 %}

答案 1 :(得分:0)

您需要在履历表类上重命名向后关系,以便可以使用{{user.resume}}访问它。

默认情况下,可以使用user.resume_set访问从简历到用户定义的ForeignKey关系。有关更多详细信息,请参见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 %}