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 %}
说明
- 针对流派字段,直接通过
mdata.genre.all()遍历所有关联的Genre对象,输出每个流派的name属性,并用逗号分隔多个流派。 - 修正了图片路径的模板变量写法,确保图片能正确加载。
- 其他字段保持原有逻辑不变,仅对
genre字段做特殊处理。
内容的提问来源于stack exchange,提问作者Nicolas_Darksoul
相关产品推荐
相关产品推荐

