Django:路径在url路径中找不到正确的主键

时间:2018-01-09 21:16:57

标签: python django django-forms django-views django-generic-views

我正在使用django2,当我访问此网址时出现错误: http://127.0.0.1:8000/hotes/12/access/7/update 我收到错误404“找不到访问对象”

长话短说: 我想更新链接到另一个的对象。为此,我必须通过链接发送两个主键(网址中的12和7)。另外,我使用Django给出的通用视图“UpdateView”。

这是我的project.urls中涉及的路径:

urlpatterns = [
    path('hotes/<int:pk>/access/<int:access_pk>/update/',views.AccessUpdateView.as_view(), name='access_update'),
    path('hotes/add',views.host_add, name='host_add'),
    path('hotes/<int:pk>/', include([
        path('edit',views.HostUpdateView.as_view(), name='host_update'),
        path('delete',views.host_delete, name='host_delete'),
    ])),
    path('hotes/<int:pk>/add/', include([
        path('access',views.access_add, name='access_add'),
        path('oncall',views.onCall_add, name='onCall_add'),
        path('network',views.network_add, name='network_add'),
    ])),
    path('hotes/<int:pk>/',views.host_view, name='host_view'),
    path('hotes/',views.hosts_view, name='hosts_view'),
    path('', views.home, name='home'),
    path('admin/', admin.site.urls),
]

我想在我的视图“AccessUpdateView”中使用第二个主键。

这是我的models.py:

的一部分
class Host(models.Model):
    name = models.CharField(max_length=30, unique=True)
    usage = models.CharField(max_length=30, blank=True)
    function = models.CharField(max_length=30, blank=True)
    production = models.NullBooleanField(blank=True, null=True)
    place = models.CharField(max_length=30, blank=True)
    type = models.CharField(max_length=30, blank=True)
    processor = models.DecimalField(max_digits=3, decimal_places=2, null=True, blank=True)
    storage = models.CharField(max_length=10, blank=True)
    memory = models.CharField(max_length=10, blank=True)
    dns_inner = models.CharField(max_length=50, blank=True)
    dns_extern = models.CharField(max_length=50, blank=True)
    os = models.ForeignKey(Os, null=True, related_name='hosts', on_delete=models.SET_NULL, blank=True)

class Access(models.Model):
    service = models.CharField(max_length=20)
    client_access = models.NullBooleanField(blank=True, null=True)
    ip = models.GenericIPAddressField()
    login = models.CharField(max_length=30, blank=True)
    password = models.CharField(max_length=50, blank=True)
    host = models.ForeignKey(Host, related_name='access', on_delete=models.CASCADE)

正如您在主机上看到的那样,可以进行多次访问,但只能链接到一个主机。

这是有关的观点:

class AccessUpdateView(UpdateView):
    model = Access
    fields = ('service','client_access','ip','login','password', )
    template_name = 'access_update.html'
    pk_url_kwarg = 'access_pk'
    context_object_name = 'access'

    def form_valid(self, form):
        access = form.save(commit=False)
        host_id = self.kwargs['pk']
        access.host_id = host_id
        access.save()
        return redirect('host_view', pk=host_id)

编辑:当我尝试访问网址时出现新错误:

/ hotes / 12 / access / 7 / update /

中的NoReverseMatch

使用参数'('',)找不到'host_view'的反转。尝试了1种模式:['hotes \ /(?P [0-9] +)\ / $']

编辑: 错误来自“access_update.html” 我删除了包含{%url host.pk%}

的Hote链接中的href
{% extends 'base.html' %}

{% load widget_tweaks %}

{% block title %}Modifier Acces{% endblock %}

{% block breadcrumb %}
  <li class="breadcrumb-item"><a href="{% url 'hosts_view' %}">Hotes</a></li>
  <li class="breadcrumb-item"><a href="">Hote</a></li>
  <li class="breadcrumb-item active">Modification Acces</li>
{% endblock %}

{% block contenu %}
  <form method="post" novalidate>
    {% csrf_token %}
    {% include 'includes/form.html' %}
    <button type="submit" class="btn btn-success">Modifier</button>
  </form>
{% endblock %}

问题是在url中编写主机pk的正确方法是什么? (host_id不起作用)

1 个答案:

答案 0 :(得分:0)

如果您想使用access_pk,则应在视图中设置pk_url_kwarg = 'access_pk'

form_valid方法中,您使用host而未定义它。如果网址中的pk是主机ID,则您可以使用self.kwargs['pk']访问它。

def form_valid(self, form):
    access = form.save(commit=False)
    host_id = self.kwargs['pk']
    access.host_id = host_id
    access.save()
    return redirect('host_view', pk=host_id)

AccessUpdateView的模板中,您可以访问access,因为这是正在更新的对象。如果您要使用主机或其ID,则应通过access访问它。

{% url 'host_view' access.host_id %}