получить request.session из модельного метода в django - PullRequest
1 голос
/ 02 июня 2010

Хей, возможно ли получить значение request.session из метода модели в django?

MEGA ОБНОВЛЕНИЕ

Вот моя модель

class GameDiscussion(models.Model):
    game = models.ForeignKey(Game)
    message = models.TextField()
    reply_to = models.ForeignKey('self', related_name='replies', null=True, blank=True)
    created_on = models.DateTimeField(blank=True, auto_now_add=True)
    userUpVotes = models.ManyToManyField(User, blank=True, related_name='threadUpVotes')
    userDownVotes = models.ManyToManyField(User, blank=True, related_name='threadDownVotes')
    votes = models.IntegerField()

    def html(self):
        DiscussionTemplate = loader.get_template("inclusions/discussionTemplate")
        return DiscussionTemplate.render(Context({
            'discussion': self,
            'replies': [reply.html() for reply in self.replies.all().order_by('-votes')]
    }))

    def _find_users_who_have_voted(self):
        user_list = []
        for user in self.userDownVotes.all():
            user_list.append(user.id)
        for user in self.userUpVotes.all():
            user_list.append(user.id)   
        return user_list

    users_voted = property(_find_users_who_have_voted)

и мой взгляд называется так

<ul>
    {% for discussion in discussions %}
        {{ discussion.html }}
    {% endfor %}
</ul>

и шаблон

<li>
<small>
    ({{ discussion.votes }} votes) 

    {% if user_id not in discussion.users_voted %}

      user not in list!

    {% endif %}     

</small>
<strong>{{ discussion.message }}</strong> 
{% if replies %}
    <ul>
        {% for reply in replies %}
            {{ reply }}
        {% endfor %}
    </ul>
{% endif %}

значение 'user_voted' возвращает список идентификаторов пользователей, которые проголосовали в этом обсуждении.

Я хочу посмотреть, находится ли значение request.session ['user']. Id внутри этого списка

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

Почему бы вам не использовать Django render_to_string внутри представления, для которого был бы счастливо доступен запрос, и вообще избегать метода модели?

ОБНОВЛЕНИЕ: после просмотра мега-обновления вы должны посмотреть теги включения Django и использовать данные из модели для заполнения шаблона, а не использовать модель для визуализации шаблона. Держите вашу модель и ваш шаблон отдельно - Django - это основа MVT / MCV по уважительной причине:)

1 голос
/ 02 июня 2010

вы можете получить доступ к текущему пользователю и, таким образом, к его сеансу, используя промежуточное ПО threadlocals

http://code.arcs.org.au/gitorious/django/django-andsome/blobs/ee8447e3dad2da9383ff701ec640b44cd50d2b0a/middleware/threadlocals.py

но имейте в виду:

http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

Возможно, существуют более эффективные решения вашей проблемы. Может быть, вы хотите уточнить, зачем вам нужен request.session на уровне модели?

UPDATE:

, поскольку вы явно вызываете какой-то метод - возможно, из представления - почему бы вам просто не указать request.user в качестве параметра для вашего html метода?

models.py:

def html(self, user):
    your code...

views.py:

yourmodel.html(request.user)

ОБНОВЛЕНИЕ до вашего MEGA ОБНОВЛЕНИЕ :

Это именно то, для чего {% include%} предназначен:

в вашем первом шаблоне сделайте это:

{% for discussion in discussions %}
    {% include "discussion.html" }}
{% endfor %}

и второй шаблон имеет request.user.id в своем пространстве имен:

{% if request.session.user.id not in discussion.users_voted %}
  user not in list!
{% endif %}     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...