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

Django中如何在表单页面显示ManyToManyField关联的对象内容?

Django 解决ManyToManyField仅显示关联数量的问题

问题说明

在音乐管理Django项目中,Mdata模型通过ManyToManyField与Genre模型关联,但在音乐详情表单页面中,流派字段仅显示选中对象的数量,无法展示具体的流派名称。

相关代码

models.py

from django.db import models
from django.contrib.auth.models import User


class Genre(models.Model):
    name = models.CharField(unique=True,max_length=20)

    def __str__(self):
        return self.name.title()


class Mdata(models.Model):
    name = models.CharField(max_length=100)
    artist = models.CharField(max_length=150)
    album = models.CharField(max_length=100)
    nation = models.CharField(max_length=100)
    duration = models.DecimalField(max_digits=4,decimal_places=2)
    released_in = models.DecimalField(max_digits=4,decimal_places=0)
    uploaded_at = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to='images/',blank=True,null=True)
    audio = models.FileField(upload_to='audios/',null=True,blank=True)
    genre = models.ManyToManyField(Genre)
    uploader = models.ForeignKey(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.name.title()+" by "+self.artist.title()

forms.py

from django import forms
from django.forms import ModelForm
from .models import Mdata


class MdataForm(ModelForm):
    class Meta:
        model = Mdata
        fields =[
            'name',
            'artist',
            'album',
            'genre',
            'nation',
            'duration',
            'released_in',
            'image',
            'audio',
            ]

原模板代码(存在问题)

{% extends 'pages/base.html' %}

{% block content %}

<form>
    {% if mdata.image %}
        <img src="mdata.image.url" height="500" width="500">
    {% endif %}

    {% for field in form %}
        <p>{{ field.label }} : {{ field.value}}</p>
    {% endfor %}
</form>

<a href="{% url 'pages:edit_music' mdata.id %}">edit</a>

{% endblock %}

解决方案

核心问题

{{ field.value }}对于ManyToManyField类型字段,返回的是关联对象的QuerySet,直接输出无法正确展示流派名称;同时原模板中图片路径写法错误,未使用Django模板变量语法。

修改后的模板代码

{% extends 'pages/base.html' %}

{% block content %}

<form>
    {% if mdata.image %}
        <img src="{{ mdata.image.url }}" height="500" width="500">
    {% endif %}

    {% for field in form %}
        {% if field.name == 'genre' %}
            <p>{{ field.label }} : 
                {% for genre in mdata.genre.all %}
                    {{ genre.name }}{% if not forloop.last %}, {% endif %}
                {% endfor %}
            </p>
        {% else %}
            <p>{{ field.label }} : {{ field.value}}</p>
        {% endif %}
    {% endfor %}
</form>

<a href="{% url 'pages:edit_music' mdata.id %}">edit</a>

{% endblock %}

说明

  1. 针对流派字段,直接通过mdata.genre.all()遍历所有关联的Genre对象,输出每个流派的name属性,并用逗号分隔多个流派。
  2. 修正了图片路径的模板变量写法,确保图片能正确加载。
  3. 其他字段保持原有逻辑不变,仅对genre字段做特殊处理。

内容的提问来源于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.25 15:15:42