{% Url ??? django टेम्प्लेट में%}


84

मैंने '' url '' टैग का उपयोग करने के उत्तरों में गूगल पर बहुत कुछ देखा है, केवल यह कहकर कि आप अपने टेम्पलेट में सम्मिलित करें और यह देखें कि आप जिस यूआरएल के लिए यूआरएल चाहते हैं, उसे प्रविष्ट करें। वैसे मेरे लिए कोई खुशी नहीं :( मैंने हर क्रमपरिवर्तन की कोशिश की है और अंतिम उपाय के रूप में यहां पोस्टिंग का सहारा लिया है।

तो यहाँ है। मेरा urls.py इस तरह दिखता है:

from django.conf.urls.defaults import *
from login.views import *
from mainapp.views import *
import settings

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^weclaim/', include('weclaim.foo.urls')),
    (r'^login/', login_view),
    (r'^logout/', logout_view),
    ('^$', main_view),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),
    #(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': '/home/arthur/Software/django/weclaim/templates/static'}),
    (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
)

मेरी 'लॉगिन' निर्देशिका में मेरा 'व्यूहोम' ऐसा दिखता है:

from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.contrib import auth

def login_view(request):
    if request.method == 'POST':
        uname = request.POST.get('username', '')
        psword = request.POST.get('password', '')
        user = auth.authenticate(username=uname, password=psword)
        # if the user logs in and is active
        if user is not None and user.is_active:
            auth.login(request, user)
            return render_to_response('main/main.html', {}, context_instance=RequestContext(request))
            #return redirect(main_view)
        else:
            return render_to_response('loginpage.html', {'box_width': '402', 'login_failed': '1',}, context_instance=RequestContext(request))
    else:
        return render_to_response('loginpage.html', {'box_width': '400',}, context_instance=RequestContext(request))

def logout_view(request):
    auth.logout(request)
    return render_to_response('loginpage.html', {'box_width': '402', 'logged_out': '1',}, context_instance=RequestContext(request))

और अंत में main.html, जिस पर login_view अंक दिखता है:

<html>
<body>
test! <a href="{% url logout_view %}">logout</a>
</body>
</html>

तो मुझे हर बार 'NoReverseMatch' क्यों मिलता है?

* (थोड़े अलग नोट पर मुझे मेरे सभी रेंडर-टू-रिस्पांस के अंत में 'reference_instance = RequestContext (रिक्वेस्ट)' का उपयोग करना पड़ा क्योंकि अन्यथा यह मेरे टेम्पलेट्स में {{MEDIA_URL}} को मान्यता नहीं देता और मैं संदर्भ नहीं दे सकता था) किसी भी सीएसएस या जेएस फाइलें। मुझे यकीन नहीं है कि यह क्यों है। मुझे सही नहीं लगता है) *


1
आप जिस बारे में कह रहे हैं context_instance=RequestContext(request)वह सही है, इसके लिए सभी टेम्प्लेट को प्रदान किए गए संदर्भ चरों पर टेम्प्लेट का उपयोग करने की अनुमति है। यह सभी सामान्य विचारों के लिए डिफ़ॉल्ट रूप से किया जाता है, लेकिन आपको इसे अपने कस्टम लोगों में स्वयं करने की आवश्यकता है।
मार्कस Whybrow

मुझे थोड़ा अजीब लगता है क्योंकि आप अपनी साइट पर निरंतरता बनाए रखने के लिए अपने टेम्पलेट से हर समय अपने सीएसएस और जेएस फाइलों तक पहुंचने जा रहे हैं। इसलिए क्या आप डिफ़ॉल्ट रूप से {{MEDIA_URL}} का उपयोग नहीं कर सकते हैं?
राबर्ट जॉनस्टोन

1
यहाँ स्वीकृत जवाब अब मान्य नहीं है
Dan Gayle

एक नया उत्तर जोड़ें और फिर मैं स्वीकार करूंगा कि
रॉबर्ट जॉनस्टोन

जवाबों:


55

logout_viewफ़ंक्शन आयात करने के बजाय , आपको अपनी urls.pyफ़ाइल में एक स्ट्रिंग प्रदान करनी चाहिए :

इसलिए नहीं (r'^login/', login_view),

परंतु (r'^login/', 'login.views.login_view'),

यह चीजों को करने का मानक तरीका है। तब आप अपने टेम्प्लेट में URL का उपयोग कर सकते हैं:

{% url login.views.login_view %}

2
हाँ, निश्चित रूप से तार का उपयोग करें। इस तरह, आप उपसर्गों का भी उपयोग कर सकते हैं, और आपको अपने सभी कार्यों को अपने URLConf में आयात करने की आवश्यकता नहीं है।
श्री राघवन

मैंने इसे भी आजमाया और 'रेंडर नॉट रेवेरमैच' का प्रतिपादन करते हुए मिला: रिवर्स फॉर 'login.views.login_views' तर्कों के साथ '()' और 'कीवर्ड' {} 'नहीं मिला।' फिर से :(
रॉबर्ट जॉनस्टोन

रुको ... स्क्रैच है कि! मैंने 15 मिनट इंतजार किया, फिर से कोशिश की और यह काम किया (yippeeee !!!)। अच्छा 1. अगला सवाल। अगर मेरे पास केवल एक ही साइट है जिसे मैंने व्यवस्थापक पृष्ठ में जोड़ा है, तो मैं इसे {% url> कैसे प्रत्यय दे सकता हूं ??? %}
राबर्ट जॉनस्टोन

हाँ, यह एक नेक्रो है, लेकिन URL टैग अभी भी मुझे 2015 में काट रहा है। यदि वे वाक्यविन्यास को बदलते नहीं रखते तो इससे मदद मिलेगी:
डेव

6
सिर्फ इसलिए कि मैं Google से यहां आया था, मुझे कहना चाहिए कि django 1.8+ के लिए, पासिंग स्ट्रिंग्स को व्यू तर्क के रूप में दर्शाया गया है, और जल्द ही हटा दिया जाएगा। आपको वास्तव में इस पोस्ट की तरह कॉल करने योग्य पास करना चाहिए।
user3599803

104

चयनित उत्तर पुराना है और कोई अन्य मेरे लिए काम नहीं करता है (Django 1.6 और [उचित रूप से] कोई पंजीकृत नाम स्थान नहीं है।)

Django के लिए 1.5 और बाद में ( डॉक्स से )

चेतावनी फ़ंक्शन पथ या पैटर्न नाम के आसपास उद्धरण देना न भूलें!

एक नामित URL के साथ आप यह कर सकते हैं:

(r'^login/', login_view, name='login'),
...
<a href="{% url 'login' %}">logout</a>

बस के रूप में आसान अगर दृश्य एक और पैरामीटर लेता है

def login(request, extra_param):
...
<a href="{% url 'login' 'some_string_containing_relevant_data' %}">login</a>

1
हाँ मुझे पता है। मैं {% load url from future %}फिलहाल 1.4 में उपयोग कर रहा हूं । अच्छा स्थान
रॉबर्ट जॉनस्टोन

5
इसे उत्तर के रूप में चुना जाना चाहिए। रिवर्स मैचिंग यूरल्स के लिए स्ट्रिंग्स का उपयोग करना नए django संस्करणों में चित्रित किया गया है।
सुमुदु

44

सुनिश्चित करें (django 1.5 और उससे आगे) कि आप url नाम को उद्धरण में रखते हैं, और यदि आपका url पैरामीटर लेता है तो उन्हें उद्धरणों के बाहर होना चाहिए (मुझे इस गलती का पता लगाने में घंटों का समय लगा!)।

{% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %}
<a href="{{ the_url }}"> link_name </a>

मुझे पता है कि यह एक पुराना उत्तर है, लेकिन इसने वास्तव में मेरी मदद की। मैं django-norel का उपयोग कर रहा हूं, जो Django 1.6 का एक कांटा है, जिसे इस समस्या को भी झेलना होगा क्योंकि उद्धरण में url के नाम को एनकैप्सुलेट करने से टाइपऑयर मुझे मिल रहा था।
लोबोब्रोबो

2
सही प्रलेखन का उपयोग करने से भी मदद मिलती है, क्योंकि वे सिंटैक्स को बदलते रहते हैं: {% url app_views.client client.id %}(कोई उद्धरण नहीं) 1.4 में, {% url 'app_views.client' client.id %}(उद्धरण के साथ) 1.5 -1.7 में, और {% url 'app-views-client' client.id %}(कोई अंडरस्कोर या डॉट्स नहीं, बस डैश) 1.8 में।
डेव

हे भगवान और मैं जल्द ही 1.8 में अपग्रेड करने की योजना बना रहा था।
बोगाटियर

17

urlटेम्पलेट टैग स्ट्रिंग के रूप और नहीं करने के लिए एक समारोह संदर्भ के रूप में पैरामीटर पारित करेंगे reverse()। यह काम करने का सबसे सरल तरीका nameदृश्य में जोड़ रहा है :

url(r'^/logout/' , logout_view, name='logout_view')

मैंने कोशिश की, लेकिन मुझे 'अमान्य वाक्यविन्यास (urls.py, पंक्ति 14)' मिल गया :(
रॉबर्ट जॉनस्टोन

इस बारे में वास्तव में अजीब बात है कि यह (PyCharm - अच्छा ऐप) मुझे लाइब्रेरी आयात (libxml2mod.name या unicodedata.name या twisted.trial.runner) की सिफारिश करने के साथ> name = 'logout_view' <का उपयोग नहीं करने देगा। नाम)
रॉबर्ट जॉनस्टोन

फ़ंक्शन को कहां reverse()परिभाषित किया गया है?
कोडब्यूस्टीन

आपके टेम्पलेट में {% url 'logout_view'%} django.readthedocs.org/en/latest/intro/tutorial03.html
जुआन रोजस

12

मैं उसी समस्या में भागता हूं।

मुझे दस्तावेज़ीकरण से क्या मिला, हमें नाम स्थान का उपयोग करना चाहिए।

आपके मामले में {% url login:login_view %}


नामस्थानों का उपयोग करना अब बहुत अधिक दिनों का है। URL को अधिक पठनीय बनाता है और वे वास्तव में आपके लिए कुछ मतलब रखते हैं
रॉबर्ट जॉनस्टोन

क्या आप कृपया प्रलेखन लिंक शामिल कर सकते हैं?
जियोसिडी

1

अपने उदाहरण से देखते हुए, क्या यह {% url myproject.login.views.login_view %}कहानी का अंत नहीं होना चाहिए ? ( myprojectअपने वास्तविक प्रोजेक्ट नाम के साथ बदलें )


रेंडर करते समय उपरोक्त 'पकड़ा गया NoReverseMatch' के समान: रिवर्स फॉर 'weclaim.login.views.login_views' तर्कों के साथ '()' और कीवर्ड तर्क '{}' नहीं मिला। ' (मुझे लगता है कि मेरी परियोजना का नाम रूट निर्देशिका के रूप में एक ही नाम है मेरे सभी कोड में संग्रहीत है)
रॉबर्ट जॉनस्टोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.