Если условный оператор в шаблоне Django не работает - PullRequest
0 голосов
/ 03 октября 2018
{% 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 голосов
/ 03 октября 2018

Во-первых, ваше состояние, похоже, изменилось.Вы обрабатываете код, когда резюме отсутствует, в операторе 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 %}
0 голосов
/ 03 октября 2018

Вам необходимо переименовать обратную связь в вашем классе резюме, чтобы вы могли получить к нему доступ, используя {{user.resume}}.

По умолчанию отношение ForeignKey, которое вы определили из резюме для пользователя, доступно с помощью user.resume_set.См. документы для получения более подробной информации.

Я предполагаю, что вы хотите иметь только одно резюме на пользователя, поэтому вы, вероятно, захотите использовать 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 %}
...