【问题标题】:Django, how do it in template?Django,如何在模板中做到这一点?
【发布时间】:2017-09-27 03:25:04
【问题描述】:

我需要这样的显示:

{% if user_rate %}
    <h2><a href="/games/{{game.id}}/{{game.slug}}/add_rate/edit/{{rate.id}}/">Edit rate</a></h2>
{% else %}
 <h2><a href="/games/{{game.id}}/{{game.slug}}/add_rate">Add rate</a></h2>
{% endif %}

但是当我使用时(如果我评价第一场比赛) user_rate = Rate.objects.filter(user=request.user) 它在游戏中向我显示“编辑”,没有费率。 objects.get() 给我: “get() 返回了多个 Rate -- 它返回了 2!”

我想显示

 {% for x in user_rate %}
 Your rate : {{x.rate}}
 {% endfor %}

但这也会显示用户在所有游戏中的评分。我在 cmets 中具有相同的结构并且它可以工作,我只看到我在这个游戏中的 cmets,但我不知道为什么它不适用于游戏的速率......

class Rate(models.Model):
    game = models.ForeignKey(Games)
    user = models.ForeignKey(User)
    rate = models.IntegerField(validators=[MinValueValidator(1),
                                   MaxValueValidator(10)])

    class Meta:
    unique_together = ['game', 'user']

views.py

def game(request, game_id, slug):
    game = Games.objects.get(id = game_id)
    genre = game.genres.all()
    platform = game.platforms.all()
    quantity = Games.objects.all().count()
    user = User.objects.all().count()
    number_of_rates = Rate.objects.filter(game_id = game_id).count()
    rate_average = Rate.objects.filter(game_id = game_id).aggregate(Avg("rate")).values()[0]



    if request.user.is_authenticated():
        user_rate = Rate.objects.filter(user=request.user)


        ctx = {'game' : game, 'genre' : genre, 'platform' : platform, 'quantity' :quantity, \
        'user' : user, 'rate_average' : rate_average, 'user_rate': user_rate, \
       'number_of_rates' : number_of_rates}
        return render(request, 'game.html', ctx)

    else:
        ctx = {'game' : game, 'genre' : genre, 'platform' : platform, 'quantity' :quantity, \
        'user' : user, 'rate_average' : rate_average, 'number_of_rates' : number_of_rates}
        return render(request, 'game.html', ctx)

【问题讨论】:

  • 你需要有一个标志来表明用户是否已经评分。
  • 这个标志怎么做?
  • 从视图发送标志
  • 可能的例子?

标签: django django-templates django-views


【解决方案1】:
# Something along the lines of this.
rate = Rate.objects.get(user=request.user)
context = {...., "user": request.user, "rate": rate}
return render(request, 'template.html', context=context)

在您的模板中:

 {% if rate %}
    <h2><a href="/games/{{game.id}}/{{game.slug}}/add_rate/edit/{{rate.id}}/">Edit rate</a></h2>
{% else %}
     <h2><a href="/games/{{game.id}}/{{game.slug}}/add_rate">Add rate</a></h2>
{% endif %}

【讨论】:

  • 应该是Rate.objects.filter,不是get,但现在可以了。非常感谢。
  • 根据您的问题,我无法得出结论。还有,第二件事。 Filter 返回一个 LIST,get 返回单个项目或错误,因此对于您的用例,最好使用 .get() 而不是 filter。如果这个答案是正确的答案,请接受它。 @abcdefghijklmn8
  • 如果我给出“get”,我会收到有关费率匹配查询的错误。
  • 你是对的。 Get 最好用……也许你会读到这个。你知道,如果我有错误,该怎么办?如果我有 1 个费率,我有费率查询错误,如果我有两个费率,我 get() 返回了多个费率 - 它返回 2! .请帮助@Borko Kovacev
  • 您能否更新您的问题以显示确切的费率查询错误和您的模型?您的建模是否允许单个用户的每个游戏有多个费率? @abcdefghijklmn8
【解决方案2】:

好的,我明白了。我真笨。 也许有一天会有人使用它。

所以我只需要

Rate.objects.filter(user = request.user, game_id = game_id)

这很简单,我对此有很多问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2010-11-04
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多