必须使用URLconf中的对象pk或slug调用通用详细信息视图

2024-09-27 00:12:17 发布

您现在位置:Python中文网/ 问答频道 /正文

Django在我尝试访问/domains/{domain}/{host}时给了我以下错误:

Generic detail view HostDetailPageView must be called with either an object pk or a slug in the URLconf.

看来DetailView期待着与我提供的不同的东西

url.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"))
]

视图.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)

型号.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, on_delete=models.CASCADE, blank=True, null=True)

    class Meta:
        ordering = ['name']

Tags: pathnamepyviewtruehostgetmodels
1条回答
网友
1楼 · 发布于 2024-09-27 00:12:17

设置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'])

相关问题 更多 >

    热门问题