{% 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
条件语句错误。
答案 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 %}