モデルの主キーをその下のビュークラスに渡すために、次のURLパターンを使用しています。関連するモデル「ホスト」の主キーは、有効なIPアドレスまたはFQDNです。ビューはオブジェクトが有効であってもクエリーセットを含めると404を返します
URLパターン:
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")
Viewクラス:
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"変数がマングルされていて有効なキーではないことを示唆しています。
解決策に感謝します。あるいは、同じ結果を達成するための代替方法です。
ご希望のホストモデルと「有効なURL」を表示してください。 –
ホストモデルをOPに追加しました。有効なURLはローカル開発環境にあるため、127.0.0.1/host/192.168.0.1であり、IPアドレスはホストモデルの関連するPK( "名前")です。 – jxm