Django报错__call__()缺少必填仅关键字参数‘manager’,模型数据无法展示
解决Django视图中ManyToMany字段触发
__call__() missing 1 required keyword-only argument: 'manager'报错的问题 这个报错我见得挺多的,结合你给出的模型代码和场景,大概率是你在模板访问ManyToMany字段的方式有误,或者视图没有正确传递/获取模型实例导致的,下面给你一步步排查和解决的方法:
一、先排查模板里的写法(最常见原因)
你的OtherInfo模型里的related_someinfo是一个ManyToManyField,它本质是一个ManyToManyManager管理器对象,而不是直接的数据集。如果在模板里你错误地把它当作函数调用,就会触发这个报错。
错误示例:
{% for item in object.related_someinfo() %} <!-- 这里加了括号,错误! --> <li>{{ item.name }}</li> {% endfor %}
正确写法:
你只需要直接迭代管理器(Django模板会自动调用.all()),或者显式调用.all()方法:
<!-- 写法1:直接迭代管理器 --> <h3>关联的Someinfo数据:</h3> <ul> {% for info in object.related_someinfo %} <li>{{ info.name }}</li> {% empty %} <li>暂无关联信息</li> {% endfor %} </ul> <!-- 写法2:显式调用.all(),更清晰 --> <h3>关联的Someinfo数据:</h3> <ul> {% for info in object.related_someinfo.all %} <li>{{ info.name }}</li> {% empty %} <li>暂无关联信息</li> {% endfor %} </ul>
二、检查视图的配置(针对FormView/DetailView)
如果模板写法没问题,那就要看视图有没有正确处理模型实例:
针对DetailView:
确保你正确指定了模型或者查询集,让DetailView能自动获取到OtherInfo的实例:
from django.views.generic import DetailView from .models import OtherInfo class OtherInfoDetailView(DetailView): model = OtherInfo # 必须指定对应的模型 template_name = 'your_detail_template.html' # 可选:自定义上下文变量名,默认是'object' context_object_name = 'other_info'
这样模板里就能通过{{ other_info.related_someinfo.all }}正常访问关联数据了。
针对FormView:
如果你的FormView需要展示OtherInfo的关联数据,要在get_context_data方法里手动把对应的实例传入上下文:
from django.views.generic import FormView from .forms import YourForm from .models import OtherInfo class YourFormView(FormView): form_class = YourForm template_name = 'your_form_template.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 根据URL参数获取对应的OtherInfo实例 context['other_info'] = OtherInfo.objects.get(pk=self.kwargs['pk']) return context
之后在模板里用{{ other_info.related_someinfo.all }}就能正常展示数据了。
三、特殊情况排查(较少见)
如果你自定义了ManyToMany字段的管理器,那要检查自定义管理器的__call__方法是否缺少参数,但从你给出的模型代码来看,这种可能性不大,优先排查前面两种情况。
内容的提问来源于stack exchange,提问作者D3sa
相关产品推荐
相关产品推荐

