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

Django多对多字段模板渲染返回main.ModelName.None问题解决

解决Django中ManyToManyField在模板显示main.Project.None的问题

问题场景

使用Django的ManyToManyField关联Product与Project模型,后台管理面板能正常查看关联数据,但在模板中调用{{ products.project }}时,返回main.Project.None。

相关代码

models.py

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

class Supplier_Profile(models.Model):
    name = models.CharField('Supplier Profile', max_length=120, blank=True)
    user = models.ManyToManyField(User)

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

class Project(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(verbose_name="Name",max_length=100, blank=True)

    def __str__(self):
        return str(self.name) if self.name else ''

class Product(models.Model):
    project = models.ManyToManyField(Project, blank=True, related_name="available_products")
    name = models.CharField('Product Name', max_length=120, blank=True)

    class Meta:
        db_table='Product'
    def __str__(self):
        return str(self.name)

views.py

def show_product(request, product_id):
    products = Product.objects.get(pk=product_id)
    return render(request, 'main/show_product.html',{'products':products}) 

原模板代码

<h6>Project Name</h6>
{{ products.project }}

问题原因

直接调用products.project实际上是访问ManyToMany字段的管理器对象,而非实际关联的数据集合。当管理器未被触发查询时,默认显示形式为app.Model.None,并非真的没有数据。

解决方法

要获取关联的Project数据,需要调用管理器的all()方法获取完整的查询集,再通过模板循环渲染每条数据的具体字段:

修改后的模板代码

<h6>Project Name</h6>
{% for project in products.project.all %}
    {{ project.name }}<br />
{% endfor %}

如果直接使用{{ products.project.all }},会显示查询集的字符串表示(如&lt;QuerySet [&lt;Project: Project 1&gt;]&gt;),因此必须通过循环遍历查询集,提取每个Project实例的具体属性(如name)来正常展示内容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:35:23