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 }},会显示查询集的字符串表示(如<QuerySet [<Project: Project 1>]>),因此必须通过循环遍历查询集,提取每个Project实例的具体属性(如name)来正常展示内容。
内容的提问来源于stack exchange,提问作者PhilM
相关产品推荐
相关产品推荐

