Python Django错误NoReverseMatch,因为它';他错过了一个pk
所以现在我在一个有url链接的页面上Python Django错误NoReverseMatch,因为它';他错过了一个pk,python,django,Python,Django,所以现在我在一个有url链接的页面上 <button href="{% url 'roomkey-request' roomkey.pk %}" >Return to request</button> url.py: path('key/<int:pk>', views.KeyDetailView.as_view(), name='roomkey-detail'), class KeyDetailView(generic.DetailView):
<button href="{% url 'roomkey-request' roomkey.pk %}" >Return to request</button>
url.py:
path('key/<int:pk>', views.KeyDetailView.as_view(), name='roomkey-detail'),
class KeyDetailView(generic.DetailView):
model = RoomKey
path('key/<int:pk>/request', views.KeyRequestCreate.as_view(), name='roomkey-request')
class KeyRequestCreate(CreateView):
model = KeyRequest
fields = ['roomkey', 'requester', 'borrower', 'request_comments']
template_name = 'catalog/roomkey_request_form.html'
<a href="{% url 'key-agreement' roomkey.pk %}">terms and conditions</a>
path('key/<int:pk>/request/agreement', views.KeyAgreement, name='key-agreement'),
def KeyAgreement(request):
return render(
request,
'catalog/roomkey_agreement.html',
)
这列出了可为特定房间借用的钥匙列表。然后,当我尝试进入下一个页面时,我可以请求借用该房间的一把钥匙,下面是负责呈现roomkey请求页面的URL和视图
url.py:
path('key/<int:pk>', views.KeyDetailView.as_view(), name='roomkey-detail'),
class KeyDetailView(generic.DetailView):
model = RoomKey
path('key/<int:pk>/request', views.KeyRequestCreate.as_view(), name='roomkey-request')
class KeyRequestCreate(CreateView):
model = KeyRequest
fields = ['roomkey', 'requester', 'borrower', 'request_comments']
template_name = 'catalog/roomkey_request_form.html'
<a href="{% url 'key-agreement' roomkey.pk %}">terms and conditions</a>
path('key/<int:pk>/request/agreement', views.KeyAgreement, name='key-agreement'),
def KeyAgreement(request):
return render(
request,
'catalog/roomkey_agreement.html',
)
该页面上有一个按钮,链接到条款和协议页面,如下所示
<button href="{% url 'roomkey-request' roomkey.pk %}" >Return to request</button>
roomkey\u request\u form.html:
path('key/<int:pk>', views.KeyDetailView.as_view(), name='roomkey-detail'),
class KeyDetailView(generic.DetailView):
model = RoomKey
path('key/<int:pk>/request', views.KeyRequestCreate.as_view(), name='roomkey-request')
class KeyRequestCreate(CreateView):
model = KeyRequest
fields = ['roomkey', 'requester', 'borrower', 'request_comments']
template_name = 'catalog/roomkey_request_form.html'
<a href="{% url 'key-agreement' roomkey.pk %}">terms and conditions</a>
path('key/<int:pk>/request/agreement', views.KeyAgreement, name='key-agreement'),
def KeyAgreement(request):
return render(
request,
'catalog/roomkey_agreement.html',
)
但是,当尝试单击该请求按钮请求密钥时,django会抛出一个错误
NoReverseMatch at /catalog/key/2/request
Reverse for 'key-agreement' with arguments '('',)' not found. 1 pattern(s)
tried: ['catalog\\/key\\/(?P<pk>[0-9]+)\\/request\\/agreement$']
NoReverseMatch at/catalog/key/2/request
找不到参数“(“”,)”的“密钥协议”的相反项。1幅(s)
已尝试:['catalog\\/key\\/(?P[0-9]+)\\/请求\\/协议$']
我在条款和协议上有一个按钮,可以返回请求页面,看起来像这样
<button href="{% url 'roomkey-request' roomkey.pk %}" >Return to request</button>
返回请求
这会返回到带有正确pk的请求页面吗?我想我只是对url如何处理pk和如何传递pk感到困惑。我想这与keyagreement无法从详细信息页面接收pk有关,有人能告诉我我做错了什么,或者告诉我一些可以帮助我理解URL如何在pk中从一个视图传递到另一个视图的资源吗?我是django的新手,因此提前感谢您的帮助 试试看:
def KeyAgreement(request, pk): #-->pk in argument
return render(
request,
'catalog/roomkey_agreement.html',
)
尝试:
如果要在
roomkey\u request\u form.html
模板中使用roomkey.pk
,则需要将roomkey
添加到模板上下文中。您可以在get\u context\u data
方法中执行此操作
由于您已经拥有URL中的roomkey pk,因此可以将其从字段中删除。然后在保存之前,在form\u valid
方法中设置roomkey
class KeyRequestCreate(CreateView):
model = KeyRequest
fields = ['requester', 'borrower', 'request_comments']
template_name = 'catalog/roomkey_request_form.html'
def get_context_data(self, **kwargs):
context = super(KeyRequestCreate, self).get_context_data(**kwargs)
context['roomkey'] = get_object_or_404(RoomKey, pk=pk)
def form_valid(self, form):
form.instance.roomkey = get_object_or_404(RoomKey, pk=pk)
return super(KeyRequestCreate, self).get_form(form)
如果要在协议视图中使用roomkey
,还必须对其进行一些更改
首先,您需要将pk
添加到函数签名中,因为它的URL模式中有
然后,您需要在模板上下文中包含roomkey
from django.shortcuts import get_object_or_404
def key_agreement(request, pk):
roomkey = get_object_or_404(roomkey, pk=pk)
return render(
request,
'catalog/roomkey_agreement.html',
{'roomkey': roomkey}
)
请注意,我已将视图函数重命名为key\u agreement
,以匹配推荐的样式。您还需要更新URL模式
path('key/<int:pk>/request/agreement', views.KeyAgreement, name='key-agreement'),
path('key//request/agreement',views.KeyAgreement,name='key-agreement'),
如果要在roomkey\u request\u form.html
模板中使用roomkey.pk
,则需要将roomkey
添加到模板上下文中。您可以在get\u context\u data
方法中执行此操作
由于您已经拥有URL中的roomkey pk,因此可以将其从字段中删除。然后在保存之前,在form\u valid
方法中设置roomkey
class KeyRequestCreate(CreateView):
model = KeyRequest
fields = ['requester', 'borrower', 'request_comments']
template_name = 'catalog/roomkey_request_form.html'
def get_context_data(self, **kwargs):
context = super(KeyRequestCreate, self).get_context_data(**kwargs)
context['roomkey'] = get_object_or_404(RoomKey, pk=pk)
def form_valid(self, form):
form.instance.roomkey = get_object_or_404(RoomKey, pk=pk)
return super(KeyRequestCreate, self).get_form(form)
如果要在协议视图中使用roomkey
,还必须对其进行一些更改
首先,您需要将pk
添加到函数签名中,因为它的URL模式中有
然后,您需要在模板上下文中包含roomkey
from django.shortcuts import get_object_or_404
def key_agreement(request, pk):
roomkey = get_object_or_404(roomkey, pk=pk)
return render(
request,
'catalog/roomkey_agreement.html',
{'roomkey': roomkey}
)
请注意,我已将视图函数重命名为key\u agreement
,以匹配推荐的样式。您还需要更新URL模式
path('key/<int:pk>/request/agreement', views.KeyAgreement, name='key-agreement'),
path('key//request/agreement',views.KeyAgreement,name='key-agreement'),
您需要显示负责呈现“roomkey\u request\u form.html”的URL和视图,因为这是发生错误的地方。“而且可能更多的模板不仅仅是一行。”DanielRoseman感谢您的回复。我更新了我的问题,您需要显示负责呈现“roomkey\u request\u form.html”的URL和视图,因为这就是错误发生的地方。“而且可能更多的模板不仅仅是一行。”DanielRoseman感谢您的回复。我更新了我的问题虽然这是真的,但不是OP看到的错误的原因。虽然这是真的,但不是OP看到的错误的原因。