क्या Django में रिवर्स है ()


219

जब मैं कभी-कभी django कोड पढ़ता हूं, तो मैं कुछ टेम्पलेट्स में देखता हूं reverse()। मुझे पूरा यकीन नहीं है कि यह क्या है लेकिन इसका इस्तेमाल HttpResponseRedirect के साथ मिलकर किया जाता है। इसका उपयोग कैसे और कब reverse()करना चाहिए?

यह अच्छा होगा अगर किसी ने कुछ उदाहरणों के साथ उत्तर दिया ...


26
एक url पैटर्न को देखते हुए, Django url () का उपयोग करके सही दृश्य चुन सकता है और एक पेज जनरेट कर सकता है। यही कारण है, url--> view name। लेकिन कभी-कभी, जैसे जब पुनर्निर्देशित किया जाता है, तो आपको रिवर्स दिशा में जाने की आवश्यकता होती है और Django को एक दृश्य का नाम दिया जाता है, और Django उपयुक्त url उत्पन्न करता है। दूसरे शब्दों में, view name --> url। वह है, reverse()(यह url फ़ंक्शन का उल्टा है)। यह सिर्फ इसे कॉल करने के लिए अधिक पारदर्शी लग सकता है, generateUrlFromViewNameलेकिन यह बहुत लंबा है और शायद सामान्य रूप से पर्याप्त नहीं है: docs.djangoproject.com/en/dev/topics/http/urls/…
eric

4
@neuronet ग्रेट स्पष्टीकरण, धन्यवाद। यह नाम मेरे लिए विशेष रूप से गैर-सहज ज्ञान युक्त (प्रतीत होता है) था, जिसे मैं एक गंभीर पाप मानता हूं। कौन अनावश्यक आपत्ति से घृणा नहीं करता है?
माइक कृंतक

यह नामकरण का एक विशिष्ट उदाहरण है जो एक इकाई (जैसे फ़ंक्शन) के एक पहलू पर जोर देता है जो उस समय प्रोग्रामर के दिमाग में सबसे महत्वपूर्ण था, उसका संदर्भ दिया गया था, लेकिन किसी अन्य डेवलपर के व्यापक संदर्भ में सबसे उपयोगी विकल्प नहीं है । हम अक्सर इस जाल में गिर जाते हैं क्योंकि प्रोग्रामर - नामकरण खोजे जाने के लिए बहुत महत्वपूर्ण है, यह अलग-अलग संदर्भों के बारे में सोचने और सोचने के लिए सबसे उपयुक्त है।
कॉर्नेल मेसन

जवाबों:


347

reverse()| Django प्रलेखन


मान लीजिए कि आपके द्वारा urls.pyइसे परिभाषित किया गया है:

url(r'^foo$', some_view, name='url_name'),

एक टेम्पलेट में आप फिर इस url का उल्लेख कर सकते हैं:

<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>

<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>

इसे इस प्रकार प्रस्तुत किया जाएगा:

<a href="/foo/">link which calls some_view</a>

अब कहते हैं कि आप अपने समान कुछ करना चाहते हैं views.py- जैसे आप /foo/किसी अन्य दृश्य में कुछ अन्य यूआरएल (नहीं ) को संभाल रहे हैं (नहीं some_view) और आप उपयोगकर्ता को /foo/(अक्सर सफल फॉर्म जमा करने पर मामला) पुनर्निर्देशित करना चाहते हैं ।

आप बस कर सकते हैं:

return HttpResponseRedirect('/foo/')

लेकिन क्या होगा अगर आप भविष्य में url बदलना चाहते हैं? आपको अपने urls.py और अपने सभी संदर्भों को अपने कोड में अपडेट करना होगा । यह DRY (खुद को दोहराएं नहीं) का उल्लंघन करता है , केवल एक ही स्थान को संपादित करने का पूरा विचार, जिसके लिए प्रयास करने के लिए कुछ है।

इसके बजाय, आप कह सकते हैं:

from django.urls import reverse
return HttpResponseRedirect(reverse('url_name'))

यह नाम के साथ परिभाषित url के लिए आपकी परियोजना में परिभाषित सभी url के माध्यम से दिखता है url_nameऔर वास्तविक url लौटाता है /foo/

इसका मतलब यह है कि आप केवल url को उसकी nameविशेषता के द्वारा संदर्भित करते हैं - यदि आप url को स्वयं बदलना चाहते हैं या आपके द्वारा संदर्भित दृश्य केवल एक स्थान का संपादन करके ऐसा कर सकते हैं - urls.py


3
FYI करें, Django 1.4 या उससे पहले का {{ url 'url_name' }}होना चाहिए {% url url_name %}। यह अगले Django रिलीज (1.5) में बदल रहा है और तब होना चाहिए {% url 'url_name' %}Url templatetag के लिए डॉक्स कुछ अच्छी जानकारी देते हैं यदि आप "फॉरवर्ड कम्पैटिबिलिटी" सेक्शन में थोड़ा नीचे स्क्रॉल करते हैं
j_syk

1
j_syk धन्यवाद - मैं @ भविष्य से @ लोड यूआरएल कर रहा हूं क्योंकि 1.3 बाहर आ गए और भूल गए कि यह अभी तक डिफ़ॉल्ट नहीं है। मैं अपने उत्तर को अपडेट करूंगा ताकि यह अनुभवहीन यात्रा न करे।
scytale

2
तय - मुझे लगता है कि यह आपके लिए अन्य लोगों के उत्तरों में अपने आप को गूंगा टाइपो को संपादित करने के लिए पूरी तरह से स्वीकार्य माना जाता है, अगर आप अधिक देखते हैं तो बस :-)
scytale

3
सबसे सूक्ष्म उत्तरों में से एक इस साइट पर मिल सकता है।
मानस चतुर्वेदी

1
">>> लेकिन क्या होगा अगर आप भविष्य में url बदलना चाहते हैं", इस प्रकार की सूक्ष्मताएँ जो समय के .0001% के लिए उपयोगी होती हैं और समाधान को एक उपयोगी सुविधा की तरह शिप किया जाता है, और लोग इसका उपयोग ऐसे करते हैं जैसे कि ' सर्वोत्तम प्रथाओं 'और गंदगी छोड़ दें। टीबीएच अगर कोई भविष्य में यूरल्स बदलता है तो आप केवल एक वैश्विक खोज-प्रतिस्थापन करते हैं। यहां तक ​​कि यह समाधान (url_name का उपयोग करें) 'क्या समस्या है यदि आप url_name को भविष्य में बदलना चाहते हैं?' 5 साल के लिए Django में कोडिंग के लिए और अभी तक की जरूरत को पूरा करने के लिए url_reverse। इस प्रकार की विषमताओं से निपटने का सबसे अच्छा तरीका है कि उन्हें इस्तेमाल करने से मना कर दिया जाए।
नेहमे

10

यह एक पुराना सवाल है, लेकिन यहां कुछ ऐसा है जो किसी की मदद कर सकता है।

आधिकारिक डॉक्स से:

Django URL के प्रदर्शन के लिए उपकरण प्रदान करता है जो विभिन्न परतों से मेल खाता है जहाँ URL की आवश्यकता होती है: टेम्पलेट में: url टेम्पलेट टैग का उपयोग करना। पायथन कोड में: रिवर्स () फ़ंक्शन का उपयोग करना। Django मॉडल इंस्टेंस के URL से संबंधित उच्च स्तरीय कोड में: get_absolute_url () विधि।

उदाहरण के लिए। टेम्प्लेट में (url टैग)

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

उदाहरण के लिए। अजगर कोड में ( reverseफ़ंक्शन का उपयोग करके )

return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

1
पूर्ण विवरण बॉस की आवश्यकता है
jJob

ओपी ने विशेष रूप से उल्लेख किया कि उन्होंने डॉक्स को पढ़ा, उन्हें स्पष्टीकरण की आवश्यकता थी, न कि डॉक्स से कॉपी / पेस्ट।
रूसी

8

मौजूदा जवाब समझा पर एक महान काम किया है क्या इस बात का 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 पैरामीटर के एक सेट के माध्यम से निर्मित है। आशा है कि यह उत्तर के पहले से ही उपयोगी सूत्र में जोड़ता है!


4

यह फ़ंक्शन शुष्क सिद्धांत का समर्थन करता है - यह सुनिश्चित करता है कि आप अपने पूरे ऐप में हार्ड कोड नहीं डालते हैं। एक url को एक स्थान पर, और केवल एक स्थान पर परिभाषित किया जाना चाहिए - आपका url conf। उसके बाद आप वास्तव में सिर्फ उस जानकारी को संदर्भित कर रहे हैं।

reverse()आपको पृष्ठ का url देने के लिए उपयोग करें , या तो देखने के लिए रास्ता दिया गया है, या आपके url conf से page_name पैरामीटर। आप इसे उन मामलों में उपयोग करेंगे जहां यह टेम्पलेट के साथ करने के लिए समझ में नहीं आता है {% url 'my-page' %}

इस कार्यक्षमता का उपयोग करने के लिए बहुत सारे संभावित स्थान हैं। एक जगह जिसे मैंने पाया है वह यह है जब उपयोगकर्ताओं को एक दृश्य में पुनर्निर्देशित किया जाता है (अक्सर एक फॉर्म की सफल प्रसंस्करण के बाद) -

return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))

टेम्प्लेट टैग लिखते समय आप इसका उपयोग भी कर सकते हैं।

एक और बार मैंने reverse()मॉडल विरासत के साथ प्रयोग किया । मेरे पास एक माता-पिता मॉडल पर एक सूची दृश्य था, लेकिन यह उन माता-पिता वस्तुओं में से किसी एक से प्राप्त करना चाहता था। मैंने get__child_url()पैरेंट को एक फंक्शन अटैच किया, जिसमें एक बच्चे के अस्तित्व की पहचान की और इसका उपयोग करके डिटेल व्यू का यूआरएल वापस कर दिया reverse()


4

उसके लिए एक डॉक है

https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

इसका उपयोग किसी दिए गए दृश्य के लिए एक URL उत्पन्न करने के लिए किया जा सकता है

मुख्य लाभ यह है कि आप अपने कोड में हार्ड कोड रूट नहीं करते हैं।


2

मौजूदा जवाब काफी स्पष्ट हैं। बस मामले में आप नहीं जानते कि इसे क्यों कहा जाता है reverse: यह एक url नाम का एक इनपुट लेता है और वास्तविक url देता है, जो पहले url रखने के लिए उल्टा होता है और फिर इसे एक नाम देता है।


1
बस एक ट्यूटोरियल (Django लड़कियों) से Django सीखने। यह एक कठिन सीखने की अवस्था है। मुझे लगता है कि इस फ़ंक्शन का नाम भयानक है: "रिज़र्व" बिना किसी योग्यता के, बहुत मजबूत तरीके से एक सूची या स्ट्रिंग को संग्रहीत करने का सुझाव देता है, जो स्पष्ट रूप से इसके साथ कुछ भी नहीं है।
माइक कृंतक

@ मैकरोडेंट मैं आपसे पूरी तरह सहमत हूं। इसके अलावा, इनमें से कोई भी उत्तर यह नहीं समझाता है कि फ़ंक्शन को रिवर्स क्यों कहा जाता है। यह इतना बुरा नाम imo है।
सोहम डोंगरगाँवकर

1

Django DRY सिद्धांत का पालन करने के लिए रिवर्स () का उपयोग किया जाता है अर्थात यदि आप भविष्य में url बदलते हैं तो आप उल्टा (urlname) का उपयोग करके उस url का संदर्भ दे सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.