Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django错误NoReverseMatch,因为它';他错过了一个pk_Python_Django - Fatal编程技术网

Python Django错误NoReverseMatch,因为它';他错过了一个pk

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):

所以现在我在一个有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):
    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看到的错误的原因。