Как использовать Post_save в Django - PullRequest
0 голосов
/ 18 ноября 2010

Я пытаюсь добавить баллы в профиль пользователя после того, как он отправил комментарий, используя структуру комментариев Django. Я думаю, что мне нужно использовать post_save, но я не уверен, что буду совершенно честным.

Вот то, что я имею в качестве метода в моих models.py:

 def add_points(request, Comment):
    if Comment.post_save():
        request.user.get_profile().points += 2
        request.user.get_profile().save()

Из примеров post_save, которые я обнаружил, это далеко от того, что показано на рисунке - так что я думаю, что я далеко от цели.

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 18 ноября 2010

К сожалению, в этом нет никакого смысла.

Во-первых, это не может быть метод, так как в нем нет self в качестве первого параметра.

Во-вторых, этоКажется, берут класс, а не экземпляр.Вы не можете сохранить сам класс, только его экземпляр.

В-третьих, post_save не является методом модели (если вы не определили его самостоятельно).Это сигнал, и вы не вызываете сигнал, вы подключаете к нему обработчик сигнала и выполняете там логику.Вы также не можете вернуть данные из сигнала в метод.

И, наконец, экземпляр профиля, к которому вы добавляете 2, не обязательно будет таким же, как тот, который вы сохранили во второй строке, потому что Djangoэкземпляры модели не имеют идентичности.Получите его один раз и поместите в переменную, затем сохраните его.

Каркас комментариев определяет свои собственные сигналы , которые вы можете использовать вместо общего post_save.Итак, что вам действительно нужно, это зарегистрировать обработчик сигнала на comment_was_posted.Внутри этого обработчика вам нужно получить профиль пользователя и обновить его.

def comment_handler(sender, comment, request, **kwargs):
    profile = request.user.get_profile()
    profile.points += 2
    profile.save()

from django.contrib.comments.signals import comment_was_posted
comment_was_posted.connect(comment_handler, sender=Comment)
...