Django通过URL主键筛选代理对应客户报id类型错误如何解决
问题原因
你在AgentClientListView的get_queryset方法中直接使用了未赋值的id变量,Python将其识别为内置的id()函数,不符合数据库主键字段需要的数值类型,因此抛出对应报错。同时你的客户筛选条件也和模型定义不匹配。
解决步骤
- 修正
get_queryset方法,从类视图的self.kwargs属性中获取URL传递的代理主键值,同时调整客户筛选逻辑:
class AgentClientListView(OrganizerAndLoginRequiredMixin, generic.ListView): template_name = "agents/agent_client_list.html" context_object_name ="clients" def get_queryset(self): # 从URL参数中获取代理主键 agent_pk = self.kwargs.get('pk') # 查询对应代理实例 agent = Agent.objects.get(pk=agent_pk) # 按外键agent筛选该代理名下的客户 queryset = Client.objects.filter(agent=agent).order_by('company_name') return queryset
- 补充上下文传递(解决前端模板读取agent变量的问题)
你的前端模板需要展示代理的姓名信息,需要在视图中新增get_context_data方法,将代理实例传递到模板:
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['agent'] = Agent.objects.get(pk=self.kwargs.get('pk')) return context
把上述方法追加到AgentClientListView类中即可。
- 清理URL配置(可选,避免后续冲突)
你的urls.py中重复定义了两次agent-delete路由,建议删除重复的那条规则。
内容的提问来源于stack exchange,提问作者Tyrone Jasper Galang
相关产品推荐
相关产品推荐

