【问题标题】:View returns 404 when including a queryset despite the object being valid尽管对象有效,但在包含查询集时查看返回 404
【发布时间】:2017-01-02 15:35:37
【问题描述】:

我正在使用以下 URL 模式将模型的主键传递给下面详述的视图类。相关模型的主键“主机”是有效的 IP 地址或 FQDN。

网址格式:

ValidIpAddressRegex = "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
ValidHostnameRegex = "(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])"

url(r"^host/(?P<pk>({}|{}))/$".format(ValidIpAddressRegex, ValidHostnameRegex),
    views.HostView.as_view(),
    name="host")

查看类:

class HostView(generic.DetailView):
    model = Host
    template_name = 'report_viewer/host.html'
    context_object_name = 'related_findings'

    def get_queryset(self):
        """Return all related findings"""
        host = get_object_or_404(Host, name=self.kwargs["pk"])
        return host.get_findings()  # A function on the model to return related records from another model

相关模板:

<ul>
    {% for finding in related_findings %}
      <li><a href="{% url 'report_viewer:finding' finding.plugin_id %}"><strong>{{ finding.plugin_id }}</strong> {{ finding.plugin_name }}</a></li>
    {% empty %}
      <li>No findings!</li>
    {% endfor %}
</ul>

主机型号:

class Host(models.Model):
    name = models.CharField(max_length=255, primary_key=True)
    os_general = models.CharField(max_length=255, blank=True, verbose_name="Generic OS Identifier")
    os_specific = models.CharField(max_length=255, blank=True, verbose_name="Reported OS Name")
    ssh_fingerprint = models.CharField(max_length=255, blank=True, verbose_name="SSH Fingerprint")
    mac_address = models.CharField(max_length=17, blank=True, verbose_name="MAC Address")
    ip_address = models.GenericIPAddressField(blank=True, null=True, verbose_name="IP Address")
    fqdn = models.CharField(max_length=255, blank=True, verbose_name="Fully Qualified Domain Name")
    netbios_name = models.CharField(max_length=255, blank=True, verbose_name="NetBIOS Name")

    def __str__(self):
        return self.name

    def get_findings(self):
        findings = Finding.objects.filter(targets=self)
        return findings

    class Meta:
        ordering = ['name']

有效 URL 的结果是“未找到与查询匹配的结果”,由 views.HostView 引发。下面的视图成功运行,调用了 {% empty %} 条件,这表明我正在错误地构造 get_object_or_404 请求,或者“pk”变量可能被破坏并且不是有效的键。

如果您有任何关于解决方案的想法,我将不胜感激。或者确实是实现相同结果的替代方法。

【问题讨论】:

  • 请显示您的主机型号,以及您要去的“有效网址”。
  • 将主机模型添加到 OP。有效的 URL 位于本地开发部署中,因此它是 127.0.0.1/host/192.168.0.1,IP 地址是 Host 模型的相关 PK(“名称”)。

标签: django django-views


【解决方案1】:

结果证明解决方案比预期的要简单得多。我试图将 get_queryset 函数与通用 DetailView 一起使用,而它本来是要与 ListView 一起使用的。

我重写了模型以改用get_context_data 函数。

class HostView(generic.DetailView):
    model = Host
    template_name = 'report_viewer/host.html'

    def get_context_data(self, **kwargs):
        """Return all related findings"""
        context = super(HostView, self).get_context_data(**kwargs)
        context['host'] = get_object_or_404(Host, name=self.kwargs["pk"])
        context['findings'] = context['host'].get_findings()
        return context

然后允许我访问模板中的相关主机模型及其所有相关的查找模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2018-03-13
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多