Django Terbalik dengan argumen '()' dan argumen kata kunci '{}' tidak ditemukan

144

Hai, saya punya masalah yang menyebalkan.

Saya memiliki pola url seperti ini:

# mproject/myapp.urls.py

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

itu berfungsi dengan baik di browser tetapi untuk pengujian, ketika saya melakukan ini di shell:

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

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

Saya mendapatkan yang ditakuti:

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

Apa yang kulewatkan di sini?

Darwin Tech
sumber
di Django terbaru , reverse diimpor dari url. yaitufrom django.urls import reverse
suhailvs

Jawaban:

261

Anda harus menentukan project_id:

reverse('edit_project', kwargs={'project_id':4})

Dok disini

miki725
sumber
1
Bisakah Anda juga memasukkan cara melakukan ini di dalam templat?
Gershom
1
docs punya contoh
miki725
Bekerja seperti cham!
Muhammad Haseeb
6

Solusi @ miki725 benar-benar benar. Atau, jika Anda ingin menggunakan argsatribut yang bertentangan kwargs, maka Anda cukup mengubah kode Anda sebagai berikut:

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

Contohnya dapat ditemukan di dokumentasi . Ini pada dasarnya melakukan hal yang sama, tetapi atribut dilewatkan sebagai argumen. Ingatlah bahwa setiap argumen yang disahkan perlu diberi nilai sebelum dibalik. Cukup gunakan namespace yang benar, yang dalam hal ini adalah 'edit_project'.

Srivats Shankar
sumber
1
Saya suka singkatnya.
Bartleby
2

Masalah ini memberi saya sakit kepala hebat ketika saya mencoba menggunakan reverse untuk menghasilkan tautan aktivasi dan mengirimkannya melalui email tentunya. Jadi saya pikir dari tests.py itu akan sama. Cara yang benar untuk melakukan ini adalah sebagai berikut:

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)) 
KRH
sumber
1
Saya baru saja mencoba ini, tidak berhasil. @ miki725 jawaban sudah benar.
Daniel van Flymen
1
Saya percaya brace ada di tempat yang salah: response = client.get (terbalik ('edit_project', project_id = 4))
Wim Feijen
1

Putuskan juga lebih mudah

from django.urls import resolve

resolve('edit_project', project_id=4)

Dokumentasi tentang pintasan ini

SebCorbin
sumber
dengan penuh hormat mencoba dan tidak bekerja untuk saya. Saya akan tetap dengan terbalik. 2018 django 2
HashRocketSyntax