मौजूदा जवाब समझा पर एक महान काम किया है क्या इस बात का reverse()
Django में कार्य करते हैं।
हालांकि, मैं आशा व्यक्त की थी कि मेरा उत्तर में एक अलग प्रकाश डाला क्यों : क्यों उपयोग reverse()
टेम्पलेट दृश्य के अन्य अधिक सरल, यकीनन अधिक pythonic दृष्टिकोण के स्थान पर बाध्यकारी है, और इस "रीडायरेक्ट की लोकप्रियता के लिए कुछ वैध कारण क्या हैं के माध्यम से reverse()
पैटर्न "Django रूटिंग लॉजिक में।
एक प्रमुख लाभ एक यूआरएल का उल्टा निर्माण है, जैसा कि दूसरों ने उल्लेख किया है। जैसे आप {% url "profile" profile.id %}
अपने ऐप की url कॉन्फ़िगरेशन फ़ाइल से url जेनरेट करने के लिए कैसे उपयोग करेंगे : उदा path('<int:profile.id>/profile', views.profile, name="profile")
।
लेकिन जैसा कि ओपी ने उल्लेख किया है, का उपयोग reverse()
आमतौर पर के उपयोग के साथ संयुक्त है HttpResponseRedirect
। पर क्यों?
मुझे पूरा यकीन नहीं है कि यह क्या है लेकिन इसका इस्तेमाल HttpResponseRedirect के साथ मिलकर किया जाता है। इसका उपयोग कैसे और कब किया जाता है?
निम्नलिखित पर विचार करें views.py
:
from django.http import HttpResponseRedirect
from django.urls import reverse
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected = question.choice_set.get(pk=request.POST['choice'])
except KeyError:
# handle exception
pass
else:
selected.votes += 1
selected.save()
return HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
))
और हमारा न्यूनतम urls.py
:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('<int:question_id>/results/', views.results, name='polls-results'),
path('<int:question_id>/vote/', views.vote, name='polls-vote')
]
में vote()
समारोह, हमारे में कोड else
ब्लॉक का उपयोग करता है reverse
के साथ HttpResponseRedirect
निम्नलिखित पैटर्न में:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
यह पहला और महत्वपूर्ण, इसका मतलब है कि हमें URL को हार्डकोड नहीं करना है (DRY सिद्धांत के अनुरूप), लेकिन अधिक महत्वपूर्ण रूप reverse()
से, तर्क से अनपेक्षित मानों args=(question.id)
को संभालकर URL स्ट्रिंग का निर्माण करने का एक सुंदर तरीका प्रदान करता है ( जो URLConigig द्वारा नियंत्रित किया जाता है)। मान लिया गया कि question
एक विशेषता है id
जिसमें मान है 5
, reverse()
तब से निर्मित URL होगा:
'/polls/5/results/'
सामान्य टेम्प्लेट-व्यू बाइंडिंग कोड में, हम उपयोग करते हैं HttpResponse()
या render()
जैसा कि वे आम तौर पर कम अमूर्त को शामिल करते हैं: एक व्यू फंक्शन एक टेम्प्लेट लौटाता है:
def index(request):
return render(request, 'polls/index.html')
लेकिन पुनर्निर्देशन के कई वैध मामलों में, हम आमतौर पर पैरामीटर की सूची से URL के निर्माण के बारे में परवाह करते हैं। इनमें ऐसे मामले शामिल हैं:
- HTML के माध्यम से जमा करें
POST
अनुरोध के
- उपयोगकर्ता लॉगिन पश्च-सत्यापन
- JSON वेब टोकन के माध्यम से पासवर्ड रीसेट करें
इनमें से अधिकांश में कुछ प्रकार के पुनर्निर्देशन शामिल हैं, और एक URL पैरामीटर के एक सेट के माध्यम से निर्मित है। आशा है कि यह उत्तर के पहले से ही उपयोगी सूत्र में जोड़ता है!
url--> view name
। लेकिन कभी-कभी, जैसे जब पुनर्निर्देशित किया जाता है, तो आपको रिवर्स दिशा में जाने की आवश्यकता होती है और Django को एक दृश्य का नाम दिया जाता है, और Django उपयुक्त url उत्पन्न करता है। दूसरे शब्दों में,view name --> url
। वह है,reverse()
(यह url फ़ंक्शन का उल्टा है)। यह सिर्फ इसे कॉल करने के लिए अधिक पारदर्शी लग सकता है,generateUrlFromViewName
लेकिन यह बहुत लंबा है और शायद सामान्य रूप से पर्याप्त नहीं है: docs.djangoproject.com/en/dev/topics/http/urls/…