不显示具有多对多关系类型的模型特性数据.错误在哪里



使用此代码时:

genres = GamesGenres.objects.annotate(Count('games'))

它给出了以下错误:

Cannot resolve keyword 'games' into field. Choices are: games_genres, id, name, slug

如果使用上面的选项;流派;";游戏";模型没有按预期显示在侧边栏区域的浏览器中。

我希望网站栏显示一个游戏流派列表,你可以通过它来过滤和选择感兴趣的流派。

models.py:

class Games(models.Model):
name = models.CharField(max_length=255)
slug = models.CharField(max_length=255, unique=True, db_index=True)
content = models.TextField()
photo = models.ImageField(upload_to="games/%Y/%m/%d/")
release_date = models.DateField()
developer = models.CharField(max_length=255)
publisher = models.CharField(max_length=255)
trailer = models.URLField()
genre = models.ManyToManyField("GamesGenres", related_name="games_genres")
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("show_games", kwargs={"games_slug": self.slug})

class GamesGenres(models.Model):
name = models.CharField(max_length=80)
slug = models.CharField(max_length=255, unique=True, db_index=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("genres", kwargs={"genre_slug": self.slug})

views.py:

class GamesList(GamesMixin, ListView):
model = Games
template_name = "main_app/games.html"
context_object_name = "games"
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
c_def = self.get_user_context(title="Games")
return dict(list(context.items()) + list(c_def.items()))

class ShowGamesGenres(GamesMixin, ListView):
model = GamesGenres
template_name = "main_app/games.html"
context_object_name = "games"
allow_empty = False
def get_queryset(self):
return Games.objects.filter(genre__slug=self.kwargs["genre_slug"]).select_related('genre')
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
c_def = self.get_user_context(title=str(context["games"][0].genre),
genre_selected=context["games"][0].genre_id)
return dict(list(context.items()) + list(c_def.items()))

utils.py:

class GamesMixin:
def get_user_context(self, **kwargs):
context = kwargs
genres = GamesGenres.objects.annotate(Count('games'))
context["genres"] = genres
if "genre_selected" not in context:
context["genre_selected"] = 0
return context

urls.py:

...
path('games/', GamesList.as_view(), name="games"),
path('games/genres/<slug:genre_slug>/', ShowGamesGenres.as_view(), name="genres"),
...

html文件:

{% extends "main_app/base.html" %}
{% block main %}
<tr>
<td valign="top" class="left-chapters">
<ul id="leftchapters">
{% if genre_selected == 0 %}
<li class="selected">All</li>
{% else %}
<li><a href="{% url 'games' %}">All</a></li>
{% endif %}
{% for g in genres %}
{% if g.games__count > 0 %}
{% if g.pk == genre_selected %}
<li class="selected">{{ g.name }}</li>
{% else %}
<li><a href="{{ g.get_absolute_url }}">{{ g.name }}</a></li>
{% endif %}
{% endif %}
{% endfor %}
</ul>
</td>
<td valign="top" class="content">
<div class="content-text col-md-10 offset-md-1">
<h1><b>{{ title }}</b></h1>
<ul class="list-articles">
{% for g in games %}
<div class="card">
<div class="card-body">
<li>
{% if g.photo %}
<p><img class="img-article-left thumb" src="{{ g.photo.url }}"></p>
{% endif %}
<h2><a class="link-games" href="{{ g.get_absolute_url }}">{{ g.name }}</a></h2>
<p>Platform: ...</p>
<p>Genre: {{ g.genre }}</p>
<p>Realese date: {{ g.release_date|date:"d-m-Y" }}</p>
</li>
</div>
</div>
{% endfor %}
</ul>
</div>
</td>
</tr>
{% endblock %}

我不确定,但我认为错误消息很清楚
无法将关键字"games"解析到字段中。选择是:games_gents,id,name,slug

这可能是因为您使用了related_name属性

您可以尝试使用此解决方案

genres = GamesGenres.objects.annotate(Count('games_genres'))

最新更新