Если условие не работает с атрибутом объекта - PullRequest
0 голосов
/ 01 апреля 2020

я пытаюсь написать приложение, похожее на Tinder. Я создал модели:

class User(db.Model, UserMixin):
    id = db.Column('id', db.Integer, primary_key=True)
    email = db.Column(db.String(100), unique=True, nullable=False)
    name = db.Column(db.String(20), nullable=False)
    age = db.Column(db.Integer, nullable=False)
    description = db.Column(db.String(200), default='')
    gender = db.Column(db.String(6), nullable=False)
    image = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    likes = db.relationship('Like', backref='liked_by', lazy=True)

    def __repr__(self):
        return f'User({self.name}, {self.gender}, {self.age}, {self.image})'

class Like(db.Model):
    id = db.Column('id', db.Integer, primary_key=True)
    like_to = db.Column(db.Integer)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

Я хочу, чтобы current_user не мог видеть пользователя на главной странице, если он ему уже понравился. И вот моя задача создать соответствующее условие. Теперь это выглядит так и не работает:

{% block content %}
    {% for user in users %}
        {% if current_user.gender != user.gender %}
            {% **if user.id not in current_user.likes** %}
            <form action="{{ url_for('like_profile', user_id=user.id) }}" method="POST">
                {{ form.hidden_tag() }}
                <p>{{ user.name }}</p>
                <p>{{ user.gender }}</p>
                <p>{{ user.age }}</p>
                <p>User id: {{ user.id }}</p>
                <p>User likes: {{ user.likes }}</p>
                <p>{{ form.submit }}</p>
            </form>
            {% endif %}
        {% endif %}
    {% endfor %}
{% endblock %}

Эта строка: если user.id нет в current_user.likes - как мне это сделать?

Функция, которая создает как :

@app.route('/profile/<int:user_id>', methods=['POST'])
def like_profile(user_id):
    user = User.query.get_or_404(user_id)
    like = Like(like_to=user.id, liked_by=current_user)
    db.session.add(like)
    db.session.commit()
    flash(f'Like has been given to {user} from {current_user}. {type(current_user.likes)}')
    return redirect(url_for('home'))

1 Ответ

0 голосов
/ 02 апреля 2020

Хорошо, ребята, может быть, кому-то будет интересно. Я нашел какое-то разрешение. Во-первых: current_user.likes предоставляет объекты Like, как сказал Илья. Я изменил отношения с lazy = True на lazy = 'dynamici c', теперь это выглядит так:

class User(db.Model, UserMixin):
    id = db.Column('id', db.Integer, primary_key=True)
    email = db.Column(db.String(100), unique=True, nullable=False)
    name = db.Column(db.String(20), nullable=False)
    age = db.Column(db.Integer, nullable=False)
    description = db.Column(db.String(200), default='')
    gender = db.Column(db.String(6), nullable=False)
    image = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    likes = db.relationship('Like', backref='liked_by', lazy='dynamic')

    def __repr__(self):
        return f'User({self.name}, {self.gender}, {self.age}, {self.image})'

class Like(db.Model):
    id = db.Column('id', db.Integer, primary_key=True)
    like_to = db.Column(db.Integer)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Like id: {self.id}, user id: {self.user_id}, like to: {self.like_to}, like from: {self.liked_by}"

И это дало мне новую функциональность, я могу: идентификатор пользователя. И мой домашний шаблон теперь выглядит так:

{% block content %}
    {% for user in users %}
        {% if current_user.gender != user.gender %}
            {% if user.id != current_user.likes.filter_by(like_to=user.id).first().like_to %}
            <form action="{{ url_for('like_profile', user_id=user.id) }}" method="POST">
                {{ form.hidden_tag() }}
                <p>{{ user.name }}</p>
                <p>{{ user.gender }}</p>
                <p>{{ user.age }}</p>
                <p>User id: {{ user.id }}</p>
                <p>User likes: {{ user.likes }}</p>
                <p>{{ form.submit }}</p>
            </form>
            {% endif %}
        {% endif %}
    {% endfor %}
{% endblock %}

Спасибо за попытку помочь мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...