gpt4 book ai didi

python - Django 2.0 - 尝试从具有 2 个 pk 段的 URL 显示详细记录

转载 作者:太空宇宙 更新时间:2023-11-04 09:46:39 24 4
gpt4 key购买 nike

我无法在我的 URL 中获取 2 个 pk 段来过滤我的 View 。第一个 pk 段是客户端的 ID,第二个 pk 段是服务器记录 id。我试过不使用默认 pk,而是使用 spk 作为服务器 ID,但无论我尝试什么,我都会不断收到错误。非常感谢任何帮助。

型号

class HardwareClientServers(models.Model):
server_type = models.ForeignKey(HardwareServerTypes, null=True, on_delete=models.PROTECT, blank=True)
client = models.ForeignKey(Clients , on_delete=models.CASCADE)
os = models.ForeignKey(HardwareOperatingSystems, null=True, on_delete=models.PROTECT, blank=True)
virtual = models.BooleanField(default=False)
memory = models.CharField(max_length=25, null=True, blank=True)
server_name = models.CharField(max_length=75, null=True, blank=True)

网址

urlpatterns = [
path('', views.client_list, name='client_list'),
path('<int:pk>/', views.ClientsDetailView.as_view(), name='client_detail'),
path('<int:pk>/serverlist/', views.ServerListView.as_view(), name='server_list'),
path('<int:pk>/serverlist/<int:spk>/', views.ServerDetailView.as_view(), name='server_detail'),]

查看

class ServerListView(ListView):
model = models.HardwareClientServers
context_object_name = 'client_servers'
template_name = 'server_list.html'
ordering = ['server_name']
def get_queryset(self):
return HardwareClientServers.objects.filter(client=self.kwargs['pk'])

class ServerDetailView(DetailView):
model = models.HardwareClientServers
context_object_name = 'client_server_details'
template_name = 'server_details.html'
def get_queryset(self):
self.spk = get_object_or_404(HardwareClientServers, id=self.kwargs['spk'])
return HardwareClientServers.objects.filter(id=self.spk)

我遇到的错误

TypeError at /clients/37563347/serverlist/1076/
int() argument must be a string, a bytes-like object or a number, not 'HardwareClientServers'
Request Method: GET
Request URL: http://127.0.0.1:8000/clients/37563347/serverlist/1076/
Django Version: 2.0.2
Exception Type: TypeError
Exception Value:
int() argument must be a string, a bytes-like object or a number, not 'HardwareClientServers'
Exception Location: C:\Users\rbest\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\__init__.py in get_prep_value, line 947
Python Executable: C:\Users\rbest\AppData\Local\Programs\Python\Python36-32\python.exe
Python Version: 3.6.4
Python Path:
['C:\\Client Support\\Django Projects\\TISRegister',
'C:\\Users\\rbest\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip',
'C:\\Users\\rbest\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs',
'C:\\Users\\rbest\\AppData\\Local\\Programs\\Python\\Python36-32\\lib',
'C:\\Users\\rbest\\AppData\\Local\\Programs\\Python\\Python36-32',
'C:\\Users\\rbest\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages']

最佳答案

好像你搞砸了你例子中的缩进

class ServerDetailView(DetailView):
model = models.HardwareClientServers
context_object_name = 'client_server_details'
template_name = 'server_details.html'
def get_queryset(self):
self.spk = get_object_or_404(HardwareClientServers, id=self.kwargs['spk'])
return HardwareClientServers.objects.filter(id=self.spk)

所以问题是 return HardwareClientServers.objects.filter(id=self.spk) 行。

由于 self.spk 是 HardwareClientServers 实例,您不能将其用于过滤器。相反,使用

return HardwareClientServers.objects.filter(id=self.spk.id)

但更好的方法是覆盖get_object,而不是get_queryset 方法。所以代码就变成了

class ServerDetailView(DetailView):
model = models.HardwareClientServers
context_object_name = 'client_server_details'
template_name = 'server_details.html'

def get_object(self):
return get_object_or_404(HardwareClientServers,
id=self.kwargs['spk'],
client=self.kwargs['pk'])

关于python - Django 2.0 - 尝试从具有 2 个 pk 段的 URL 显示详细记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49500576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com