условие if == не выводит ожидаемые результаты в шаблоне django

Новичок здесь. Извините, если это очень простой вопрос.

Я работаю с шаблоном Django, используя python. Мое условное выражение, похоже, не работает. Здесь я предположил, что базовое сравнение строк между a и be должно дать Very Happy, второй блок. Это не так. Я вывожу для отображения в окне браузера, и результат всегда очень разочаровывает. Я никогда не получаю Very Happy 2-й блок.

Вот упрощенная версия моего кода:

a = "test4"
b = "test5"

{% if a == b %}
<strong>Very Frustrating</strong>
{% else %}
<strong>Very Happy</strong>
{% endif %}

В моем фактическом коде a и b будут импортированы переменные (чтобы гарантировать, что только зарегистрированные пользователи могут делать определенные вещи). Вот так: a = {{logged_user}} b = {{clicked_username}}

Я ввел простейшие тестовые значения для a и b (две разные строки), чтобы изолировать проблему для ясности. Я могу предоставить фактический код. Но я подумал, что если это не работает должным образом с простыми строками как есть, то проблема именно в этом.

Спасибо за ваше время.


Актуальный код ниже. Цель состоит в том, чтобы кнопка редактирования была видна только для сообщений пользователя (т.е. пользователь может редактировать только свои собственные сообщения).
{% if post.username == logged_user %} не показывает никаких кнопок редактирования (даже для случаев, когда post.username & logged_username кажутся одинаковыми). Я заменил строки в моем упрощенном примере выше, чтобы проверить, связано ли это с типами данных и т. д.

Принимая во внимание, что если я перейду на {% if post.username != logged_user %}, это произойдет (хотя это не то, что я хочу). Похоже, что выражение, написанное ниже, просто оценивается как ложное, поэтому ничего не отображается.

<div class="post-section">
    {% for post in all_posts %}
            <div class="each_post">
                 <a href="{% url 'profile' post.username %}" class="poster_name">{{ post.username }}</a>
                 <div class="post_post" id="{{post.id}}">{{post.post}}</div>
                {% if user.is_authenticated %}
                {% if post.username == logged_user %}
                <button class="edit_button">Edit</button>
                {% else %}
                {% endif %}
                {% endif %}
                <div id="content_edit"></div>
                 <p class="post_date">{{post.timestamp}}</p>
                 <p class="like_link" id="lk{{post.id}}">{{post.like_count}}</p>
            </div>
    {% endfor %}
</div>

Мой блок просмотра

@csrf_exempt
def post(request):
    posts = Post.objects.order_by("-timestamp").all()
    paginator = Paginator(posts, 10)
    page = request.GET.get('page')
    all_posts = paginator.get_page(page)
    if request.method == "POST":

        new_entry = request.POST["user_post"]
        new_post = Post.objects.create(username=User.objects.get(username=request.session["user"]), post=new_entry)
        context = {
            "logged_user": request.session["user"],
            "all_posts": all_posts, 
        }
        return render(request, "network/main.html", context)

    else:

        context = {
            "logged_user": request.session["user"],
            "all_posts": all_posts,
        }

        return render(request, "network/main.html", context)

применимая модель класса

class User(AbstractUser):
    num_followers = models.IntegerField(default=0)
    num_following = models.IntegerField(default=0)

    def __str__(self):
        return f"{self.username}"

class Post(models.Model):
    username = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.CharField(max_length=300)
    timestamp = models.DateTimeField(auto_now=True)
    like_count = models.IntegerField(default=0)

    def __str__(self):
        return f"{self.post}"

    def serialize(self):
        return {
            "id": self.id,
            "post": self.post,
            "timestamp": self.timestamp.strftime("%m %d %Y, %I:%M %p")
        }

Вывод. Упрощенный пример, который я начал с test4 и test5, имеет один и тот же тип данных, строки, поэтому не должно быть проблем со сравнением разных типов данных. Я чувствую, что если я смогу понять, что пошло не так в упрощенном примере, я смогу экстраполировать на свою реальную проблему. Еще раз всем спасибо.


person Sopeade Lanlehin    schedule 15.07.2020    source источник
comment
Вы уверены, что logged_user и clicked_username соответствуют вашим ожиданиям? Содержат ли какие-либо из них пробелы в начале или в конце? Одинаковы ли верхний и нижний регистры в обеих строках?   -  person Some programmer dude    schedule 15.07.2020
comment
Они оба распечатываются как один и тот же пользователь. Хотя и с разными типами (как один из экземпляра класса). В любом случае, тогда не должны работать случаи test5 и test4. Поскольку это просто строки с очень четким форматированием, без пробелов и т. д.   -  person Sopeade Lanlehin    schedule 15.07.2020


Ответы (2)


Предварительно мы можем начать с проверки типов двух переменных

 a = {{logged_user}} //(as per naming seems like it would be a User class object)
 b = {{clicked_username}} //(as per naming seems like it would be a string)

Проверьте там типы данных, и если вы обнаружите, что это должно быть сравнение a.username с b

person Vivek Srivastava    schedule 15.07.2020
comment
logged_user получается из request.session[user] и имеет тип ‹class str›. post.username имеет тип ‹class 'network.models.User'›. Однако, если проблема заключается в сравнении разных типов, а не в какой-либо другой проблеме, не должны ли случаи test5 и test4 работать в упрощенном 1-м примере выше, как они обе струны и т.д.? Спасибо. - person Sopeade Lanlehin; 15.07.2020

Спасибо всем за советы. Да, это была проблема с типом данных (я не понимал, что это так важно в таких сравнениях). Я slugified моя объектная переменная, чтобы преобразовать в строку, как так.

'''{% if post.username|slugify == logged_user %}'''

Теперь это работает!

person Sopeade Lanlehin    schedule 16.07.2020