You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中ManyToManyField用法及按Genre关联展示音乐列表指引

可行性确认与实现指引

完全可行,你通过ManyToManyField设置的关联已经支持这种反向查询需求,只需调整视图和模板即可实现点击流派展示对应音乐列表的功能。

一、模型优化(可选但推荐)

你当前设置的related_name='genres_relation'命名不够直观,建议改为语义化的名称(比如musics),后续通过流派对象获取关联音乐时代码可读性更强:

genres = models.ManyToManyField('Genres', related_name='musics')

二、调整视图逻辑

当前视图仅获取了所有流派,未处理当前点击流派的关联音乐,修改get_context_data方法利用反向关联查询目标音乐:

from django.views.generic import DetailView
from . import models

class GenreDetailView(DetailView):
    model = models.Genres
    template_name = 'genre_detail.html'
    context_object_name = 'current_genre'  # 给当前流派对象设置直观的上下文名称

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 通过反向关联获取当前流派的所有音乐
        # 若未修改related_name,替换为self.object.genres_relation.all()
        context['music_list'] = self.object.musics.all()
        # 可选:添加所有流派列表,用于页面跳转导航
        context['all_genres'] = models.Genres.objects.all()
        return context

三、编写模板(genre_detail.html)

在模板中展示当前流派名称及对应的音乐列表:

<h1>{{ current_genre.genre_name }}</h1>

<h2>该流派下的音乐</h2>
{% if music_list %}
    <ul>
        {% for music in music_list %}
            <li>
                <a href="{{ music.get_absolute_url }}">{{ music.name }}</a>
                <span> - {{ music.band }}</span>
                <span> ({{ music.release|date:"Y-m-d" }})</span>
            </li>
        {% endfor %}
    </ul>
{% else %}
    <p>暂无该流派的音乐内容</p>
{% endif %}

<!-- 可选:展示所有流派导航 -->
<h3>所有流派</h3>
<ul>
    {% for genre in all_genres %}
        <li><a href="{% url 'pages:genre_detail' genre.pk %}">{{ genre.genre_name }}</a></li>
    {% endfor %}
</ul>

四、配置URL路由

确保路由能匹配到流派详情页:

from django.urls import path
from .views import GenreDetailView

app_name = 'pages'

urlpatterns = [
    # 其他现有路由...
    path('genre/<int:pk>/', GenreDetailView.as_view(), name='genre_detail'),
]

五、添加流派跳转入口

在音乐列表页或详情页给流派添加跳转链接,比如在音乐详情页展示流派时:

<p>所属流派:
    {% for genre in music.genres.all %}
        <a href="{% url 'pages:genre_detail' genre.pk %}">{{ genre.genre_name }}</a>{% if not forloop.last %}, {% endif %}
    {% endfor %}
</p>

内容的提问来源于stack exchange,提问作者Nicolas_Darksoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:35:41