Условия в выражениях IF требуют, чтобы значения были указаны явно - PullRequest
1 голос
/ 01 мая 2019

Я создал шаблон, который отображает элементы из цикла. Внутри цикла есть условие, но условие не работает, если не указано явно.

<code>{% extends 'blog/base.html' %}
{% block content %}

    <h3>{{ user.username }}</h3>

    {% for project in projects %}
        {% if user.username == 'testuser' %}
            <h5>{{ project.title }}</h5>
            <p>{{ project.description }}</p>
            <p>{{ project.objectives }}</p>
            <pre>{{ project.score }}
{{ project.student_id }}
{% endif%} {% endfor%} {% endblock content%}

Приведенный выше код работает отлично и возвращает записи, назначенные пользователю с именем testuser.

Но если я напишу код, как показано ниже, он пропуститвсе записи

<code>{% extends 'blog/base.html' %}
{% block content %}

    <h3>{{ user.username }}</h3>

    {% for project in projects %}
        {% if user.username == project.student_id %}
            <h5>{{ project.title }}</h5>
            <p>{{ project.description }}</p>
            <p>{{ project.objectives }}</p>
            <pre>{{ project.score }}
{{ project.student_id }}
{% endif%} {% endfor%} {% endblock content%}

Я добавил код из модели

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Projects(models.Model):
    title = models.CharField(max_length=150)
    description = models.TextField()
    objectives = models.TextField()
    score = models.IntegerField()
    #file = models.FileField()
    date_posted = models.DateTimeField(default=timezone.now)
    student_id = models.ForeignKey(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.title

1 Ответ

1 голос
/ 01 мая 2019

student_id является объектом User, а не строкой , поэтому здесь вы сравниваете строку (username) с объектом User, а User симя пользователя 'testuser', не совпадает со строкой 'testuser'.

Наиболее элегантным решением, вероятно, является сравнение пользователя с пользователем, поэтому:

{% if <b>user</b> == project.student_id %}

Поэтому мы опускаем .username и сравниваем объект User с объектом User.

Примечание : перечисление (особенно в шаблоне, нотакже в самом слое Django), не эффективен, вы должны сделать запрос, который выполняет фильтрацию за вас.

Вы можете отфильтровать набор запросов с помощью:

user_projects = Project.objects.<b>filter(student_id=request.user)</b>

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

Примечание : A ForeignKey обычно не имеет суффикс _id.Django автоматически добавит дополнительное поле с именем fieldname_id, в котором будет храниться первичный ключ, на который ссылается внешний ключ.В конце концов, ForeignKey в Django будет лениво загружать связанный объект.

...