Как можно оставить комментарий в карточке?

Как правильно реализовать функцию добавления комментария к карточкам в вашем приложении? Я столкнулся с проблемой при написании обработчика. Вот мой текущий код: 

```python
@app.route('/add_comment', 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=post_com)
        try:
            db.session.add(comment)
            db.session.commit()
            flash("Комментарий успешно добавлен")
            return redirect('index')
        except: "Ошибка при добавлении комментария"
    else:
        flash("Необходимо заполнить все поля ")
        return redirect('/index')
```

Однако при нажатии кнопки отправки возникает ошибка `TypeError: add_comment() missing 1 required positional argument: 'id'`, даже несмотря на то, что я указал параметр `id`. Обратите внимание, что комментарий привязан к двум моделям: `User` и `Cards`. Как я могу решить эту проблему?
  • 23 сентября 2024 г. 9:43
Ответы на вопрос 2
Проблема, с которой вы столкнулись, связана с тем, что ваш маршрут `/add_comment` не принимает параметр `id`. Нужно передать `id` в URL, чтобы Flask мог правильно его обработать. В вашем текущем маршруте `add_comment` не указано, как передать этот параметр.

Вот как вы можете обновить ваш маршрут и обработчик:

1. Обновите маршрут, чтобы он принимал параметр `id`:

```python
@app.route('/add_comment/<int:id>', methods=['GET', 'POST'])
def add_comment(id):
```

2. Убедитесь, что при отправке формы вы передаете `id` карточки, к которой добавляется комментарий. Пример формы может выглядеть следующим образом:

```html
<form action="{{ url_for('add_comment', id=card.id) }}" method="post">
    <textarea name="text" required></textarea>
    <button type="submit">Добавить комментарий</button>
</form>
```

3. В вашем обработчике вы используете `Cards.query.get(id)`, чтобы получить карточку. Однако вы не можете просто передать объект `post_com` в комментарий. Вместо этого вам нужно передать `post_com.id` (или просто `id`) в качестве `card_id`. Исправьте это в следующем фрагменте кода:

```python
comment = Comments(text_comment=text, user_id=author_com, card_id=post_com.id)
```

Теперь ваш полный код обработчика будет выглядеть так:

```python
@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=post_com.id)
        try:
            db.session.add(comment)
            db.session.commit()
            flash("Комментарий успешно добавлен")
            return redirect('index')
        except Exception as e:
            db.session.rollback()  # откатить транзакцию в случае ошибки
            flash("Ошибка при добавлении комментария: " + str(e))
            return redirect('/index')
    else:
        flash("Необходимо заполнить все поля")
        return redirect('/index')
```

Не забудьте также обработать возможные исключения, чтобы откатить транзакцию в случае возникновения ошибок. Удачи с вашим проектом!
Погоди, у тебя параметр id откуда должен браться, и как передаваться? 
ЕМНИП, параметры метода-обработчика - это в первую очередь GET-параметры. А у тебя в url для роута параметры не прописаны.
Если ты берёшь id из поля формы, то убери его из параметров, и бери его аналогично text.
Похожие вопросы