如何在Django模板中渲染多对多关联的角色名称?
解决Django多对多角色名称显示问题
1. 修复模板循环结构错误
你的模板存在语法错误:多余的{% endfor %}导致循环结构混乱,且角色查询代码写在循环外部,无法获取当前freelancers对象的关联角色。正确的模板写法如下:
{% for f in free %} <p>{{ f.user }}</p> <div>关联角色:</div> {% for role in f.role.all %} <span>{{ role.name }}</span> <!-- 直接调用角色的name字段 --> <!-- 也可以利用roles模型的__str__方法,直接写 {{ role }} 显示名称 --> {% empty %} <span>无关联角色</span> {% endfor %} <br> {% endfor %}
2. 优化视图查询性能(推荐)
当前视图的freelancers查询未预取关联数据,会触发多次数据库查询(N+1问题)。可以通过select_related(处理外键)和prefetch_related(处理多对多)优化查询效率:
def company_details(request, id): obj = Company.objects.get(id=id) pro = Projects.objects.filter(company=id) # 预取user外键和role多对多关联数据,减少数据库查询次数 free = freelancers.objects.filter(company=id).select_related('user').prefetch_related('role') return render(request, 'company/company_details.html', { 'obj': obj, 'pro': pro, 'free': free, })
3. 额外建议:规范模型命名(可选)
按照Django和PEP8的通用规范,模型类名建议使用大驼峰命名,比如将roles改为Role,freelancers改为Freelancer,提升代码可读性和规范性。
内容的提问来源于stack exchange,提问作者Naffis
相关产品推荐
相关产品推荐

