2009-12-17 15 views
28

मैं Django URL namespaces के हैंग होने की कोशिश कर रहा हूँ। लेकिन मुझे कोई उदाहरण या दस्तावेज नहीं मिल रहा है।आप Django यूआरएल नेमस्पेस का उपयोग कैसे करते हैं?

यहाँ मैं क्या करने की कोशिश की है।

urls.py:

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    (r'^foo/', include('sub_urls', namespace='foo', app_name='foo')), 
    (r'^bar/', include('sub_urls', namespace='bar', app_name='bar')),    
) 

sub_urls.py:

from django.conf.urls.defaults import patterns, url 
from views import view1 

urlpatterns = patterns('views', 
    url(r'^(?P<view_id>\d+)/$', view1, name='view1') 
) 

views.py:

from django.shortcuts import render_to_response 

def view1(request, view_id): 
    return render_to_response('view1.html', locals()) 

view1.html में, {% यूआरएल foo: View1 3% } आउटपुट/foo/3, और {% यूआरएल बार: देखें 1 3%} आउटपुट/बार/3। यह सच है कि मैं/foo/X या/bar/X पर ब्राउज़ करता हूं या नहीं।

मैं जो चाहता हूं वह/foo/X या/bar/x ब्राउज़ करने में सक्षम होना है, और क्रमशः /%/foo/3 या/bar/3 आउटपुट {% url view1 3%} आउटपुट है।

+0

कारण यह है कि मैं ऐसा कर रहा हूं ताकि मैं दो नामस्थान अलग-अलग सीएसएस फाइलों का उपयोग कर सकूं। अर्थात। ब्राउज़िंग/foo में foo.css शामिल होगा, और/बार में bar.css शामिल होगा। –

+0

मुझे पता होगा कि एक ही सामग्री के साथ विभिन्न यूआरएल होने से निश्चित रूप से आपकी साइट खोज इंजन पर दंडित हो जाएगी। मुझे नहीं पता कि यह आपके लिए चिंता का विषय है या नहीं, लेकिन यदि ऐसा है, तो मैं इस बारे में किसी अन्य तरीके से काम करने की सलाह दूंगा। शायद आप क्लाइंट पर एक कुकी सेट कर सकते हैं और उन्हें किसी अन्य तरीके से सीएसएस शैलियों का चयन करने दें। – Clueless

+0

मैंने विभिन्न उप-डोमेन पर आधारित सीएसएस सेट करना समाप्त कर दिया। यह स्थानीय रूप से परीक्षण करने के लिए सिर्फ एक दर्द है, जिसके लिए होस्टफाइल प्रविष्टियों की आवश्यकता होती है। –

उत्तर

3

मुझे लगता है कि यह अभी Django में संभव नहीं है। इस message board post पर एक नज़र डालें जो Ticket 11559 संदर्भित करता है।मुझे लगता है कि आप एक ही काम करने की कोशिश कर रहे हैं - यूआरएल टैग पर प्रभावी रूप से एक अंतर्निहित पैरामीटर पास करें।

यह भी मानते हुए कि sub_urls एक ही ऐप से है, आपको यह सुनिश्चित करना चाहिए कि app_name दोनों मामलों में समान है। आपको केवल नामस्थान बदलने की आवश्यकता है।

0

यहाँ एक समाधान मैं के साथ आया है।

views.py:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def render_response_context(view, locals): 
    request = locals["request"] 
    app = "bar" if request.META["PATH_INFO"].lower().startswith("/bar") else "foo" 
    return render_to_response(view, locals, 
     context_instance=RequestContext(request, current_app=app)) 

def view1(request, view_id):  
    return render_response_context('view1.html', locals()) 

view1.html:

{% load extras %} 
{% namespace_url view1 3 %} 

extras.py:

from django import template 
from django.core.urlresolvers import reverse 

register = template.Library() 

@register.tag 
def namespace_url(parser, token): 
    tag_name, view_string, arg1 = token.split_contents() 
    return NamespaceUrlNode(view_string, arg1) 

class NamespaceUrlNode(template.Node): 
    def __init__(self, view_string, arg1): 
     self.view_string = view_string 
     self.arg1 = arg1 
    def render(self, context): 
     return reverse("%s:%s" % (context.current_app, self.view_string), args=[self.arg1]) 

मूल रूप से मैं हमेशा या तो के रूप में "CURRENT_APP संदर्भ पारित करने के लिए सुनिश्चित किया foo "या" bar ", जिसे मैं अनुरोध URL को देखकर मैन्युअल रूप से गणना करता हूं। फिर मैं एक कस्टम टैग का उपयोग करता हूं जो current_app के आधार पर एक यूआरएल हल करता है।

यह बहुत सामान्य नहीं है; "foo" और "bar" हार्ड-कोड किए गए हैं, और टैग केवल एक तर्क ले सकता है। यहां तक ​​कि उन मुद्दों के साथ भी, यह एक हैक की तरह लगता है।

0

मुझे पता नीचे समाधान सूखी प्रिंसिपल का उल्लंघन करती है, जैसा कि आप अनिवार्य रूप से बनाने के foo और बार के लिए यूआरएल config फ़ाइलें नकल करने की है, फिर भी मुझे लगता है कि यह काम करना चाहिए।

urls.py:

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    (r'^foo/', include('sub_urls_foo')), 
    (r'^bar/', include('sub_urls_bar')),    
) 

sub_urls_foo.py:

from django.conf.urls.defaults import patterns, url 
from views import view1 

urlpatterns = patterns('views', 
    url(r'^(?P<view_id>\d+)/$', view1, 'view1_foo', {'namespace': 'view1_foo'}) 
) 

sub_urls_bar.py:

from django.conf.urls.defaults import patterns, url 
from views import view1 

urlpatterns = patterns('views', 
    url(r'^(?P<view_id>\d+)/$', view1, 'view1_bar', {'namespace': 'view1_bar'}) 
) 

views.py:

from django.shortcuts import render_to_response 

def view1(request, view_id, namespace): 
    return render_to_response('view1.html', locals()) 
,210

और फिर टेम्पलेट के लिए इस का उपयोग करें:

{% url namespace 3 %} 

मैं {% यूआरएल%} टैग के नाम अनुभाग में एक चर का उपयोग कर के विचार का परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह काम करना चाहिए।

+0

तो आपको या तो {% url view1_bar 3%} या {% url view1_foo 3%} का उपयोग करने की आवश्यकता होगी? जो मैं वास्तव में चाहता हूं वह {% url view1 3%} का उपयोग करने में सक्षम होना है, और यह उस नाम के आधार पर foo या bar चुनता है जिस पर नामस्थान वर्तमान यूआरएल से मेल खाता है। –

+0

आपका अधिकार, मेरा उदाहरण काम नहीं करेगा। मैंने इसे धारणा के तहत बनाया है कि मैं एक टेम्पलेट वैरिएबल को {% url%} टैग में पास कर सकता हूं। जो मैंने अब पढ़ा है वह मामला नहीं है। तो यह आपको दो विकल्प छोड़ देता है। या तो रिवर्स() का उपयोग करके अपने दृश्य में यूआरएल को संसाधित करें और इसे टेम्पलेट में संदर्भ में पास करें, या कस्टम टेम्पलेट टैग बनाएं। –

5

ऐसा करने का कोई सीधा तरीका नहीं लगता है। जब आप टेम्पलेट टैग का उपयोग करके पेश करते हैं, तो मैं एक समान समाधान का उपयोग करता हूं, हालांकि मुझे एक अधिक सामान्य तरीका मिला। मैं इस तथ्य का इस्तेमाल किया है कि आप अपने यूआरएल conf में वैकल्पिक पैरामीटर पारित कर सकते हैं, तो आप नाम स्थान का ट्रैक रख सकते:

#urls.py 
from django.conf.urls import defaults 

urlpatterns = defaults.patterns('', 
    defaults.url(r'^foo/', include('sub_urls', namespace='foo', app_name='myapp'), 
    kwargs={'namespace':'foo'}), 
    defaults.url(r'^bar/', include('sub_urls', namespace='bar', app_name='myapp'), 
    kwargs={'namespace':'bar'}),  
) 

कि भी सूखी सिद्धांत का उल्लंघन करता है, लेकिन बहुत ज्यादा नहीं है, हालांकि :)

तब में

आपके विचार आप नाम स्थान चर मिल (sub_urls.py ही होगा):

#views.py 
from django import shortcuts 

def myvew(request, namespace): 
    context = dict(namespace=namespace) 
    return shortcuts.render_to_response('mytemplate.html', context) 

बाद में आप सिर्फ एक सरल टैग की जरूरत है कि आप अपने नाम स्थान चर और दृश्य नाम को पारित:

#tags.py 
from django import template 
from django.core import urlresolvers 

register = template.Library() 

def namespace_url(namespace, view_name): 
    return urlresolvers.reverse('%s:%s' % (namespace, view_name, args=args, kwargs=kwargs))) 
register.simple_tag(namespace_url) 

और टेम्पलेट में इसका इस्तेमाल करते हैं (एक स्ट्रिंग के रूप में अपने दृश्य का नाम पारित करने के लिए सुनिश्चित करें, और नहीं एक टेम्पलेट चर के रूप में):

<!-- mytemplate.html --> 
{% load tags %} 
{% namespace_url namespace "view1"%} 

अपने संकेत के लिए धन्यवाद btw .. मैं sth लिए देख रहा था। इस तरह।

+0

मुझे लगता है कि यह एक बहुत पुरानी पोस्ट है, हालांकि, dict (नेमस्पेस = नेमस्पेस) कम्प्यूटेशनल रूप से अधिक महंगा है कि {'नेमस्पेस': नेमस्पेस}। क्यों पता लगाने के लिए 'डी' का प्रयोग करें! – explodes

+0

नेमस्पेस_यूआरएल फ़ंक्शन में छोटे बदलाव: def namespace_url (नेमस्पेस, view_name, * args, ** kwargs): urlresolvers.reverse ('% s:% s'% (नेमस्पेस, view_name), args = args, kwargs = kwargs) आपको यूआरएल पैरामीटर – georgerw

+0

Thx का समर्थन करने की अनुमति देगा। अच्छा जोड़ा इसे उत्तर में जोड़ा गया। –

संबंधित मुद्दे