2017-01-02 3 views
1

モデルの主キーをその下のビュークラスに渡すために、次の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"変数がマングルされていて有効なキーではないことを示唆しています。

解決策に感謝します。あるいは、同じ結果を達成するための代替方法です。

+0

ご希望のホストモデルと「有効なURL」を表示してください。 –

+0

ホストモデルをOPに追加しました。有効なURLはローカル開発環境にあるため、127.0.0.1/host/192.168.0.1であり、IPアドレスはホストモデルの関連するPK( "名前")です。 – jxm

答えて

0

解決策は予想よりもずっと簡単でした。 ListViewで使用するときに汎用のDetailViewでget_queryset関数を使用しようとしていました。

代わりに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 

これにより、テンプレート内の関連するホストモデルと関連するすべてのFindingモデルにアクセスすることができます。

関連する問題