Django:路径在 url 路径中找不到正确的主键
Django: path doesn't find the right primary key in url path
我正在使用 django2,当我访问这个 url 时出现错误:
http://127.0.0.1:8000/hotes/12/access/7/update
我收到错误 404 "None access object was found"
长话短说:
我想将一个对象 linked 更新为另一个对象。为此,我必须通过 link 发送两个主键(url 中的 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)
如您所见,在主机上可以有多个访问权限,但 link 中的一个访问权限只能访问一个主机。
这是关注的观点:
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)
编辑:当我尝试访问 url:
时出现新错误
NoReverseMatch 在 /hotes/12/access/7/update/
'host_view' 的反转,未找到参数“(”,)“。尝试了 1 种模式:['hotes\/(?P[0-9]+)\/$']
编辑:
错误来自 "access_update.html"
我删除了 Hote link 中的 href,其中包含 {% url host.pk %}
{% 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 无效)
如果你想使用access_pk
,那么你应该在视图中设置pk_url_kwarg = 'access_pk'
。
在您的 form_valid
方法中,您使用的是 host
而未定义它。如果 URL 中的 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 %}
我正在使用 django2,当我访问这个 url 时出现错误: http://127.0.0.1:8000/hotes/12/access/7/update 我收到错误 404 "None access object was found"
长话短说: 我想将一个对象 linked 更新为另一个对象。为此,我必须通过 link 发送两个主键(url 中的 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)
如您所见,在主机上可以有多个访问权限,但 link 中的一个访问权限只能访问一个主机。
这是关注的观点:
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)
编辑:当我尝试访问 url:
时出现新错误NoReverseMatch 在 /hotes/12/access/7/update/
'host_view' 的反转,未找到参数“(”,)“。尝试了 1 种模式:['hotes\/(?P[0-9]+)\/$']
编辑: 错误来自 "access_update.html" 我删除了 Hote link 中的 href,其中包含 {% url host.pk %}
{% 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 无效)
如果你想使用access_pk
,那么你应该在视图中设置pk_url_kwarg = 'access_pk'
。
在您的 form_valid
方法中,您使用的是 host
而未定义它。如果 URL 中的 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 %}