@aeHarkonnen

Как в Django использовать request.user в моделях?

Мне нужно сделать проверку в модели, что-то типа:

Class Action(models.Model):
...
    def voted(self):
        RedisCache = redis.StrictRedis()
        return RedisCache.sismember("ph_real:%i" % self.id, self.request.user.id)


Но у меня не получается получить self.request.user.id. Можно ли его как-то получить в модели? Может можно создать def voted(self, id): и передать id из шаблона?

Предыстория задачи, в общем-то она и не особо нужна для решения вопроса:

У меня есть лента событий с голосованием по каждому событию
Stream.html:
{% for action in action_list %}   
        {% if action.voted%}
            <p>You have already voted</p>
        {% else %}
            <form action="{% url "vote" action.id %}" method="post">{% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="Submit" />
            </form>
        {% endif %}


Само голосование работает, не работает проверка {% if action.voted%} , не могу понять как ее организовать. Данные о уже проголосовавших лежат в кэше, у меня получилось сделать проверку через контекст, она работает:

context["voted"] = RedisCache.sismember("ph_real:%i" % self.object.id, self.request.user.id)
  • Вопрос задан
  • 5956 просмотров
Пригласить эксперта
Ответы на вопрос 3
@leclecovich
Модель, а также логика, заключенная в ней, ничего не знает о реквесте. Если Вы вызываете метод voted из вьюхи, то и передавайте request как параметр: def voted(self, request): или def voted(self, user_id):
Ответ написан
crazyzubr
@crazyzubr
Python backend-developer
Почему так важно сделать именно через метод модели? Если так не устраивает контекст, то можно создать фильтр для шаблона.

Также, в качестве альтернативы, можно использовать пакет django-pandora. Он позволяет получить request в любом месте кода, будь то метод в модели или где-нибудь в форме.
Ответ написан
Комментировать
@aeHarkonnen Автор вопроса
С удовольствием сделал бы метод kiss, но action_list я получаю из замечательного приложения django-acivity-stream. В котором он определяется как:

у меня:
action_list = user_stream(self.request.user)

В приложении django-activity-stream:

user_stream = Action.objects.user

class Action(models.Model):
...
objects = actstream_settings.get_action_manager()

class ActionManager(GFKManager):

    @stream
    def user(self, object, **kwargs):

        q = Q()
        qs = self.filter(public=True)
        actors_by_content_type = defaultdict(lambda: [])
        Еще строк 20...


По мне, дописать что-то туда, так это ass pain x10. Поэтому и искал такое решение, видимо придется остановиться на фильтре.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы