• Как сделать reidrect на предыдущую страницу?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Flask
    Седой и строгий
    Очевидно, у комментария есть foreign key на пост, соответственно можно сконструировать url поста, к которому относился отредактированный комментарий.
    Ответ написан
    2 комментария
  • Как добавить комментарий к карточке?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    @app.route('/add_comment/<int:id>', methods=['GET', 'POST'])
    def add_comment(id):
        if request.method == 'POST':
            author_com = current_user.id
            post_com = Cards.query.get(id)
            text = request.form['text']
            comment = Comments(text_comment=text, user_id=author_com, card_id=id)  # Здесь указывается card_id=id
            try:
                db.session.add(comment)
                db.session.commit()
                flash("Комментарий успешно добавлен")
                return redirect('index')
            except:
                flash("Ошибка при добавлении комментария")
                return redirect('index')
        else:
            flash("Необходимо заполнить все поля")
            return redirect('/index')
    Ответ написан
    3 комментария
  • Как вернуться с динамического адреса на сайт?

    Vapaamies
    @Vapaamies
    Психанул и снес свои ответы козлам, не отмечающим…
    Разве не так?
    <a href="/index">Тык</a>

    Сделал себе страницу с динамическими адресами

    Уже похоже на задачу на роутеры — когда придумывается и продумывается цельная система адресации страниц, реализуемая затем через единую точку входа.
    Ответ написан
    1 комментарий
  • Надо ли выгружать файл базы данных на гитхаб?

    @kkidd
    Выгружать БД не надо, в .gitignore добавить исключение для локальной бд.
    На БД "файлы" остались 66ce5c6b697ad065143392.png
    Если кто-то выгрузит репозиторий, то он их увидит.
    Если сделаешь дополнения и обновишь их на гите, старая версия останется
    https://github.com/dem171/RepProject/commits
    Ответ написан
    Комментировать
  • Как привязать обработчик flask'a к форме html?

    @DDV23
    Биокибернетик
    routing и form handling - это называется.
    Не совсем понятно что вы хотите рендерить? Я так понимаю отдельный шаблон для страницы редактирования вы хотите рендерить, а не основной?
    return render_template('index.html', card=card) " # тогда используй название придуманного html который будет рендерится при редактирование.

    Вместо index.html тогда создайте HTML-шаблон (название придумайте), который будет рендерится при редактировании карточки.

    Вот пример body под вашу задачу. Остальное сами осилите.
    <body>
        <h1>Редактирование карточки</h1>
        <form action="{{ url_for('upd_card', id=card.id) }}" method="POST">
            <label for="name">Название:</label>
            <input type="text" id="name" name="name" value="{{ card.name }}" required><br><br>
    
            <label for="text">Текст:</label>
            <textarea id="text" name="text" required>{{ card.text }}</textarea><br><br>
    
            <input type="submit" value="Сохранить">
        </form>
    </body>


    На index.html где у Вас карточки установите кнопки для каждой карточки
    <a href="{{ url_for('upd_card', id=card.id) }}">Редактировать</a>
    Ответ написан
    1 комментарий
  • Взаимодействие методов внутри класса?

    Vindicar
    @Vindicar
    RTFM!
    # Ты заявляешь следущее:
    # "метод udar должен вызываться на экземпляре объекта (self) с двумя параметрами: hp и dmg"
    def udar(self,hp,dmg):
        print("Наносит урон с руки")
        # при этом метод не использует переданные параметры?
        rep = self.hp - self.dmg  # почему self.dmg? Боец бьёт себя?
        return "Осталось здоровья: " + rep
    
    
    # а ниже у тебя:
    # метод udar() фактически вызывается с одним параметром: другим бойцом
    boec.udar(boec2)


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

    Вот моя идея (может, несколько усложнённая, но, надеюсь, понятная):
    class Fighter:
        def __init__(self, name: str, hp: int, damage: int):  # указывай типы параметров - так проще понять, что нужно методу
            """Конструктор инициализирует экземпляр бойца заданными значениями."""
            self.name: str = name
            self.hp: int = hp
            self.damage: int = damage
        
        def is_defeated(self) -> bool:
            """Возвращает True, если боец не может более сражаться."""
            return self.hp <= 0  # в простейшем случае, если у бойца не осталось HP
    
        def calculate_attack_on(self, other: 'Fighter') -> int:
            """Метод определяет, сколько урона наш боец (self) нанесёт бойцу other. Возвращает число очков урона."""
            # сейчас урон всегда одинаков, но потом тут можно будет прикрутить что-то посложнее
            # например, рандомный урон в диапазоне, или бонусы/малусы против конкретных бойцов, или ещё что
            return self.damage  
    
        def receive_damage(self, damage: int) -> int:
            """Метод определяет, сколько HP наш боец (self) потеряет, получив урон damage, и уменьшает его здоровье. Возвращает число фактически потерянных очков здоровья."""
            # сейчас метод просто вычитает урон из очков здоровья. 
            # но потом при желании можно добавить, например, механику "последний шанс", 
            # когда первый "смертельный" удар оставляет бойца на 1 хп. Или сопротивление/уязвимость к урону, или ещё что.
            lost = min(self.hp, damage)  # если у нас 1 очко здоровья, мы не можем потерять 10
            self.hp -= lost
            return lost
    
        def attack_other(self, target: 'Fighter') -> int:
            """Проводит атаку нашего бойца (self) по другому бойцу (target). Возвращает нанесённый урон."""
            attack_damage = self.calculate_attack_on(target)
            actual_damage = target.receive_damage(attack_damage)
            return actual_damage

    Как видишь, у каждого метода есть свой достаточно чётко очерченный круг обязанностей. Хотя, конечно, можно придраться и сказать, что receive_damage() делает две вещи и его стоит разбить на два метода.
    Названия методов должны однозначно указывать, что они делают. Например, udar ничего не говорит о том, кто кого ударяет, тогда как attack_other намекает, что атаку производит тот, у кого вызвали метод, в адрес того, кого передали как параметр метода. То же самое касается параметров методов.
    Весь вывод вынесен из класса, это не его обязанность:
    boec = Fighter("вася",200,22)
    boec2 = Fighter("bob",100,19)
    print(f'{boec.name}: {boec.hp} HP;  {boec2.name}: {boec2.hp} HP')
    dmg = boec.attach_other(boec2)
    print(f'{boec.name} нанёс {dmg} урона {boec2.name}')
    print(f'{boec.name}: {boec.hp} HP;  {boec2.name}: {boec2.hp} HP')
    Ответ написан
    2 комментария
  • Взаимодействие методов внутри класса?

    Maksim_64
    @Maksim_64
    Data Analyst
    далее создал 2 бойца (боец 1 и боец 2) и присвоил им класс fighter

    Ты создал два экземпляра класса fighter (в python принято давать имена классам с заглавной буквы) fighter-> Fighter.

    далее я бойцом 1 применил метод удар на бойца 2
    Это тебе так захотелось, в описании метода класса 'udar' об этом нет слова. Твой класс умеет бить только собственный экземпляр точнее имеет намерение ударить себя (так как атрибут здоровья не обновляется)

    Нужно передавать экземпляр другого класса, в общем измененная версия твоего кода
    class fighter:
        def __init__(self,name=None,hp=None,dmg=None,):
            self.name = name
            self.hp = hp
            self.dmg = dmg
    
    
        # def udar(self,hp,dmg):
        #     print("Наносит урон с руки")
        #     rep = self.hp - self.dmg
        #     return "Осталось здоровья: " + rep
    
        def udar(self,other):
            print(self.name + " наносит урон с руки" 'c уроном ' + str(self.dmg))
            other.hp = other.hp - self.dmg
            return "У " + other.name + " осталось здоровья: " + str(other.hp)
    boec = fighter("вася",200,22)
    boec2 = fighter("bob",100,19)
    boec.udar(boec2)
    Ответ написан
    8 комментариев
  • Python цикл while и random?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Отступы.
    if a == b:
    print("Костии стали равны с  " , c)


    2. У тебя здесь белее одной переменной 'с' ты ее объявил на английской раскладке а вот здесь print("Костии стали равны с " , с) она на русской (другая переменная которой нет).

    Остальное это не ошибки по смыслу отрегулируй, что внести в тело цикла, а что вынести. Например вот это input("Нажмите ентер для выхода") не имеет никакого смысла.
    Ответ написан
    2 комментария