1

次のようなモデルがあります。

class Topic(models.Model):
    name = models.CharField(max_length=50)

class Vote(models.Model):
    user = models.ForeignKey(User, related_name='user_set')
    topic = models.ForeignKey(Topic, related_name='topic_set')
    score = models.IntegerField(default=0)

    class Meta:
        unique_together = ("user", "topic")

インデックス ビューで、すべてのトピックのリストを表示したいと考えています。ユーザーがすでにトピックに投票している場合、スコアが表示されます。ユーザーが投票していない場合は、ユーザーが投票するためのフォームを表示する必要があります。

Topicクラスの一部としてこのメ​​ソッドを使用してモデルを拡張しました。

def user_has_already_voted(self, user):
    if not Vote.objects.filter(topic=self.id,user=user.id):
        return True
    else:
        return False

ただし、このタスクを実行するために対応するテンプレートを使用してビューを作成する方法がわからないため、これが Django での方法であるかどうかはわかりません。IndexView現在のところ、次のようなジェネリックを使用しています。

class IndexView(generic.ListView):
    template_name = 'topics/index.html'
    context_object_name = 'latest_topic_list'

    def get_queryset(self):
        return Topic.objects.order_by('-pub_date')[:5]
4

3 に答える 3

2

コンテキストを使用します。ビューで追加:

    def get_context_data(self, **kwargs):
        context = {
            'is_voted' : self.user_has_already_voted(self.request.user),
        }
        context.update(kwargs)
        return super(IndexView, self).get_context_data(**context)

そしてテンプレートの使用では:

{% if is_voted %}
     Show vote results
{% else %}
     Show vote form
{% endif %}
于 2013-10-19T14:56:05.313 に答える
1

テンプレートで user_has_already_voted にアクセスできます。

{% if topic.user_has_already_voted %}
Show vote results
{% else %}
Show vote form
{% endif %}
于 2013-10-19T09:46:06.573 に答える
0

RedirectViewこれを実現するためにa を使用できます。

あなたのviews.pyで、このようなことをしてください(これは私が現在のプロジェクトで使用しているコードです。アイデアは非常に似ています.

class AbstimmungRedirectView(generic.RedirectView):

    def get_redirect_url(self, pk):
        abstimmung = get_object_or_404(Abstimmung, pk=pk)     
        if abstimmung.abgeschlossen(): 
            #Die Abstimmung wurde durch Angabe eines Enddatms als "Beendet" markiert
            return reverse('my_app:MultipleChoiceFrageResults', args=(int(pk),))
        else:
            return reverse('my_app:MultipleChoiceFrageDetail', args=(int(pk),))

abstimmung.abgeschlossen()myを yourに置き換え、has_voted()表示するテンプレートの逆 URL を使用する必要があります。

于 2013-10-19T18:52:34.520 に答える