ไม่พบ Django ย้อนกลับด้วยอาร์กิวเมนต์ '()' และคำหลัก '{}'


144

สวัสดีฉันมีปัญหาที่ทำให้โกรธ

ฉันมีรูปแบบ URL เช่นนี้:

# mproject/myapp.urls.py

url(r'^project/(?P<project_id>\d+)/$','user_profile.views.EditProject',name='edit_project'),

มันทำงานได้ดีในเบราว์เซอร์ แต่สำหรับการทดสอบเมื่อฉันทำเช่นนี้ในเปลือก:

from django.test import Client
from django.core.urlresolvers import reverse

client= Client()
response = client.get(reverse('edit_project'), project_id=4)

ฉันกลัวมาก:

NoReverseMatch: Reverse for 'edit_project' with arguments '()' and keyword arguments '{}' not found.

ฉันหายไปนี่อะไร


ในdjango ล่าสุดการย้อนกลับจะถูกนำเข้าจาก URL iefrom django.urls import reverse
suhailvs

คำตอบ:



6

ทางออก @ miki725 นั้นถูกต้องอย่างแน่นอน หรือหากคุณต้องการใช้แอargsททริบิวต์เมื่อเทียบกับkwargsคุณสามารถแก้ไขโค้ดได้ดังนี้:

project_id = 4
reverse('edit_project', args=(project_id,))

ตัวอย่างนี้สามารถพบได้ในเอกสาร สิ่งนี้ทำสิ่งเดียวกันโดยพื้นฐานแล้ว แต่แอตทริบิวต์จะถูกส่งเป็นอาร์กิวเมนต์ โปรดจำไว้ว่าข้อโต้แย้งใด ๆ ที่ถูกส่งผ่านจำเป็นต้องได้รับการกำหนดค่าก่อนที่จะถูกย้อนกลับ เพียงแค่ใช้ Namespace 'edit_project'ที่ถูกต้องซึ่งในกรณีนี้คือ


1
ฉันชอบความกะทัดรัดของมัน
Bartleby

2

ปัญหานี้ทำให้ฉันปวดหัวมากเมื่อฉันพยายามใช้ reverse เพื่อสร้างลิงค์เปิดใช้งานและส่งทางอีเมลแน่นอน ดังนั้นฉันคิดว่าจาก tests.py มันจะเหมือนกัน วิธีที่ถูกต้องในการทำเช่นนี้คือ:

from django.test import Client
from django.core.urlresolvers import reverse

#app name - name of the app where the url is defined
client= Client()
response = client.get(reverse('app_name:edit_project', project_id=4)) 

1
ฉันแค่ลองมันไม่ได้ผล คำตอบของ @ miki725 ถูกต้อง
Daniel van Flymen

1
ฉันเชื่อว่าวงเล็บปีกกาอยู่ในตำแหน่งที่ไม่ถูกต้อง: response = client.get (ย้อนกลับ ('edit_project', project_id = 4))
Wim Feijen

1

การแก้ปัญหานั้นยังตรงไปตรงมามากขึ้น

from django.urls import resolve

resolve('edit_project', project_id=4)

เอกสารเกี่ยวกับทางลัดนี้


พยายามด้วยความเคารพและไม่ทำงานสำหรับฉัน ฉันจะติดกับย้อนกลับ 2018 django 2
HashRocketSyntax
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.