python - 我想单独过滤每个代理的客户。姜戈
问题描述
我正在创建一个视图,我可以在其中通过 PK 显示特定代理的所有客户端。
当我使用 Client.objects.all() 作为查询集并且它可以显示所有客户端时,我没有出错。但是我不知道如何通过 select pk for Url 过滤客户端。
请帮忙。
这是我的 Views.py
class AgentClientListView(OrganizerAndLoginRequiredMixin, generic.ListView):
template_name = "agents/agent_client_list.html"
context_object_name ="clients"
def get_queryset(self):
user= Agent.objects.get(pk=id)
queryset = Client.objects.filter(user=user, agent__isnull=False).order_by('company_name')
return queryset
我的 Urls.py:
from django.urls import path
from .views import AgentListView, AgentCreateView, AgentDetailView, AgentUpdateView, AgentDeleteView, AgentClientListView
app_name = 'agents'
urlpatterns = [
path('', AgentListView.as_view(), name='agent-list'),
path('<int:pk>/', AgentDetailView.as_view(), name='agent-detail'),
path('<int:pk>/update/', AgentUpdateView.as_view(), name='agent-update'),
path('<int:pk>/delete/', AgentDeleteView.as_view(), name='agent-delete'),
path('<int:pk>/agent_client_list', AgentClientListView.as_view(), name='agent_client_list'),
path('<int:pk>/delete/', AgentDeleteView.as_view(), name='agent-delete'),
path('create/', AgentCreateView.as_view(), name='agent-create'),
]
这是客户端模型
class Client(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=20)
mobile_number = models.CharField(max_length=12)
email = models.EmailField(null=True, blank=True)
organization = models.ForeignKey(UserProfile, null=True, blank=True, on_delete=models.CASCADE)
agent = models.ForeignKey("Agent", related_name="clients", null=True, blank=True, on_delete=models.SET_NULL)
category = models.ForeignKey("Category", related_name="clients", null=True, blank=True, default=6, on_delete=models.SET_NULL)
company_name = models.CharField(max_length=50 , default=None)
street_address = models.CharField(max_length=50 , default=None)
baranggay = models.CharField(max_length=50 , default=None)
city = models.CharField(max_length=50 , default=None)
region = models.CharField(max_length=50 , default=None)
date_added = models.DateTimeField(auto_now_add=True)
phoned = models.BooleanField(default=False)
special_files = models.FileField(blank=True , null=True)
def __str__(self):
return self.company_name
和 HTML:
{% extends "base.html" %}
{% block content %}
<section class="text-gray-600 body-font overflow-hidden">
<div class="container px-5 py-24 mx-auto">
<div class="lg:w-4/5 mx-auto flex flex-wrap">
<div class="lg:w-1/2 w-full mx-auto">
<h2 class="text-sm title-font text-gray-500 tracking-widest">AGENT</h2>
<h1 class="text-gray-900 text-3xl title-font font-medium mb-4">{{ agent.user.first_name }} {{ agent.user.last_name }}</h1>
<div class="flex mb-4">
<a href="#" class="flex-grow text-blue-500 border-b-2 border-blue-500 py-2 text-lg px-1">
Description
</a>
</a>
<a href="#" class="flex-grow border-b-2 border-gray-300 py-2 text-lg px-1">
Update
</a>
</div>
<div class="flex flex-col w-full">
<div class="-my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
<div class="py-2 align-middle inline-block min-w-full sm:px-6 lg:px-8">
<div class="shadow overflow-hidden border-b border-gray-200 sm:rounded-lg">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="text-2xl px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100 rounded-tl rounded-bl">Client Name</th>
<th class="text-2xl px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100">Point Person</th>
<th class="text-2xl px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100">Date Added</th>
<th class="text-2xl px-4 py-3 title-font tracking-wider font-medium text-gray-900 text-sm bg-gray-100">Client Status</th>
</thead>
{% for client in clients %}
<tbody>
<tr>
<div>
<td class="mt-3"><a href="{% url 'clients:client-detail' client.pk %}" class="text-xl hover:text-blue-500">{{ client.company_name }}</a></td>
<td class="mt-3">{{ client.first_name }} {{ client.last_name }}</td>
<td class="mt-3">{{ client.date_added }}</td>
<td class="mt-3 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800"> {{ client.category }}</td>
</div>
</tr>
</tbody>
{% endfor %}
</table>
</div>
</div>
</div>
{% endblock content %}
但是我收到此错误:
TypeError at /agents/7/agent_client_list
Field 'id' expected a number but got <built-in function id>.
Request Method: GET
Request URL: https://techcrm.herokuapp.com/agents/7/agent_client_list
Django Version: 3.1.4
Exception Type: TypeError
Exception Value:
Field 'id' expected a number but got <built-in function id>.
Exception Location: /app/.heroku/python/lib/python3.9/site-packages/django/db/models/fields/__init__.py, line 1776, in get_prep_value
Python Executable: /app/.heroku/python/bin/python
Python Version: 3.9.2
Python Path:
['/app/.heroku/python/bin',
'/app',
'/app/.heroku/python/lib/python39.zip',
'/app/.heroku/python/lib/python3.9',
'/app/.heroku/python/lib/python3.9/lib-dynload',
'/app/.heroku/python/lib/python3.9/site-packages']
Server time: Mon, 31 May 2021 15:22:53 +0800
非常感谢您!
解决方案
不能id
在 中使用get_queryset
,因为 this 指的是内置id
函数,而不是对象的主键。
您可以通过以下方式获取 URL 参数self.kwargs
:
class AgentClientListView(OrganizerAndLoginRequiredMixin, generic.ListView):
template_name = 'agents/agent_client_list.html'
context_object_name ='clients'
def get_queryset(self):
agent = Agent.objects.get(pk=self.kwargs['pk'])
return Client.objects.filter(agent=agent, agent__isnull=False).order_by('company_name')
然而,直接过滤主键可能会更好,因此使用一个查询而不是两个查询:
class AgentClientListView(OrganizerAndLoginRequiredMixin, generic.ListView):
template_name = 'agents/agent_client_list.html'
context_object_name ='clients'
def get_queryset(self):
return Client.objects.filter(agent_id=self.kwargs['pk'], agent__isnull=False).order_by('company_name')
推荐阅读
- python - 错误:选择一个有效的选项。该选择不是可用的选择之一
- azure - 如何将我的 dll 和其他二进制文件从 asp.net 网站的 bin 文件夹复制到 azure devops 管道
- appium-android - 使用 dumpsys adb shell 命令时未获取包和当前焦点信息
- angular - 将列表附加到另一个列表
- html - 如何从超链接中删除下划线?
- python - 如何在 Matplotlib 中绘制 2 个 x 轴标签?
- reactjs - 下一个 Js 应用构建
- python - 在python中单击toast通知时如何执行功能?
- python - Matplotlib 'ValueError:子图的非法参数:(1、5)'
- python - 如何在 Rundeck 选项中使用 optiontype 作为 FILE