如何解决通用详细信息视图必须使用URLconf中的对象pk或slug调用
当我尝试访问/domains/{domain}/{host}
时,Django给我以下错误:
Generic detail view HostDetailPageView must be called with either an object pk or a slug in the URLconf.
看来DetailView
期望的东西与我提供的东西有所不同。
urls.py
urlpatterns = [
path('domains/',DomainsPageView.as_view()),path('domains/<str:domain>',DomainHostsPageView.as_view()),path('domains/<str:domain>/<str:host>',HostDetailPageView.as_view()),path('',TemplateView.as_view(template_name="hosts/index.html"))
]
views.py
class HostDetailPageView(DetailView):
template_name = 'hosts/hostdetail.html'
model = Host
# Populates list of enabled domains in the context
def get_queryset(self):
qs = super().get_queryset()
filtered = qs.filter(name=self.kwargs['host'])
if not filtered.exists():
raise Http404("Host does not exist")
# filter by a variable captured from url,for example
return filtered.first()
def get_context_data(self,**kwargs):
return super().get_context_data(**kwargs)
models.py
class Host(models.Model):
created = models.DateTimeField(auto_now_add=True)
last_updated = models.DateTimeField(auto_now=True)
name = models.CharField(unique=True,max_length=settings.MAX_CHAR_COUNT)
ip_addresses = models.ManyToManyField(IPAddress)
services = models.ManyToManyField(Service)
domain = models.ForeignKey(Domain,on_delete=models.CASCADE)
os = models.ForeignKey(OperatingSystem,on_delete=models.CASCADE,blank=True,null=True)
ciphers = models.ManyToManyField(Cipher,blank=True)
certificate = models.ForeignKey(Certificate,null=True)
class Meta:
ordering = ['name']
解决方法
设置 pk_url_kwarg
属性并覆盖视图的 get_queryset(...)
方法
class HostDetailPageView(DetailView):
template_name = 'hosts/hostdetail.html'
model = Host
pk_url_kwarg = 'name'
def get_queryset(self):
return super().get_queryset().filter(host__name=self.kwargs['host'])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。