Django 1.11模板无法渲染多对多字段数据问题求助
解决Django ManyToMany字段模板显示为
xxx.None的问题 嘿,这个问题我碰到过好多次!你看到的task.LabelTask.None和auth.User.None是因为ManyToManyField本质是一个对象集合,直接在模板里输出它的话,Django不知道怎么把这个集合转换成可读的字符串,就会显示这种默认格式。后台管理显示正常是因为Admin后台自动帮你处理了集合的遍历和对象字符串转换,咱们自己的模板得手动处理一下,分两步来:
第一步:确保关联模型有正确的__str__方法
首先得让LabelTask和User模型返回用户能看懂的字符串,不然就算遍历了,显示的可能还是对象的内存地址或者默认名称。比如:
# models.py里的LabelTask模型 class LabelTask(models.Model): # 假设你的LabelTask有name字段,根据实际情况调整 name = models.CharField(max_length=100) def __str__(self): # 返回标签的名称,这样模板里输出label时就会显示这个名称 return self.name # 如果是自定义User模型,或者需要调整默认User的显示 from django.contrib.auth.models import AbstractUser class User(AbstractUser): def __str__(self): # 返回用户名,后台和模板都会用这个 return self.username
第二步:在模板里正确遍历ManyToMany集合
直接输出task.label_task不行,得获取集合里的所有对象,然后逐个输出。有两种常用方式:
方式一:用for循环遍历(推荐,更灵活)
可以自定义分隔符,还能处理空集合的情况:
<small>{{ task.author }}</small> <h1>{{ task.name_task }}</h1> <p>Label - {% for label in task.label_task.all %} {{ label }}{% if not forloop.last %}, {% endif %} {% empty %} 无标签 {% endfor %} </p> <p>Executive - {% for user in task.executive_man.all %} {{ user }}{% if not forloop.last %}, {% endif %} {% empty %} 无执行人 {% endfor %} </p>
方式二:用join过滤器简化代码
如果不需要复杂的格式,直接用Django的join过滤器把集合元素用分隔符连起来:
<small>{{ task.author }}</small> <h1>{{ task.name_task }}</h1> <p>Label - {{ task.label_task.all|join:", "|default:"无标签" }}</p> <p>Executive - {{ task.executive_man.all|join:", "|default:"无执行人" }}</p>
这里的default过滤器是用来处理没有关联对象时的提示文本。
这样修改之后,模板里就能正常显示标签和执行人的名称啦~
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

