2012-01-19 6 views
9

के साथ रीडायरेक्ट करें मैं पाइथन और डीजेंगो में नया हूं और मेरे पास रीडायरेक्ट फ़ंक्शन के बारे में कोई प्रश्न है।Django kwarg

यह मेरी views.py फ़ाइल का एक कम संस्करण है।

def page_index(request, error_message=''): 
    print error_message 

def add_page(request): 
    return redirect('page_index') # this work fine 
    return redirect('page_index', error_message='test') # this does not work 

और यहाँ मेरी urls.py का एक लघु संस्करण है

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', {'error_message': 't'}, name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 

जब मैं कीवर्ड तर्क सब कुछ ठीक काम करता है बिना PAGE_INDEX के लिए पुनः निर्देशित की कोशिश, लेकिन मैं जब मैं kwag का उपयोग निम्न त्रुटि प्राप्त संदेश:

पृष्ठों पर/NoReverseMatch/तर्क के साथ 'PAGE_INDEX' के लिए जोड़ सकते हैं/

रिवर्स '()' एक डी कीवर्ड तर्क '{' error_message ':' test '}' नहीं मिला।

मैं क्या गलत कर रहा हूं?

उत्तर

10

संक्षिप्त उत्तर: 'error_message' कीवर्ड के लिए आपकी यूआरएल योजना में कोई जगह नहीं है।

लंबे समय तक जवाब:

रीडायरेक्ट() फंक्शन रिवर्स() कॉल एक यूआरएल का निर्माण करना है; यह 302 रीडायरेक्ट स्टेटस कोड, और नया यूआरएल के साथ एक HTTP प्रतिक्रिया लौटकर उस यूआरएल पर उपयोगकर्ता का ब्राउज़र भेजने जा रहा है। किसी भी कीवर्ड तर्क जो आप रिवर्स() को आपूर्ति करते हैं, को यूआरएल के हिस्से के रूप में समाप्त करना होता है - इस तरह वे उपयोगकर्ता को सूचित करते हैं।

आपके मामले में, हालांकि, 'पेज_इंडेक्स' के लिए यूआरएल को '^ $' के रूप में परिभाषित किया गया है - यह रूट यूआरएल है, जो ब्राउज़र में 'http://yoursite.com/' जैसा दिखता है।

यदि आप अन्य जानकारी वाले रीडायरेक्ट को जारी करने में सक्षम होना चाहते हैं, तो आपको यूआरएल में इसके लिए एक जगह परिभाषित करने की आवश्यकता होगी, या इसे एक अलग तरीके से जोड़ना होगा।

दो तीन तरीके इस बात के लिए काफी आम है:

  1. एक क्वेरी पैरामीटर का प्रयोग करें - इस ग्राहक स्पष्ट रूप को संदेश भेजता है; यदि आप सावधान नहीं हैं, तो लोग आपके इंडेक्स पेज को जो कुछ भी चाहते हैं उसे बनाने के लिए यूआरएल तैयार कर सकते हैं।

    return redirect(reverse('page-index')+"?error_message=test")) 
    
  2. छिपाने की जगह संदेश सत्र में और इसे बाहर खींच जब अगले पृष्ठ लोड - यह आवश्यक है कि आप सत्र कॉन्फ़िगर किया गया है, और बजाय करने के लिए ग्राहक पर भरोसा करने की बजाय सर्वर साइड पर सब कुछ का ट्रैक रखता है, आप वापस भेजने त्रुटि संदेश:

    def add_page(request): 
        request.session['error_message'] = 'test' 
        return redirect('page-index') 
    
    def page_index(request): 
        print request.session.get('error_message','') 
    
  3. इस के लिए संदेशों ढांचे का प्रयोग करें - यह तदर्थ सत्र गुणों से अधिक पसंद किया जाता है, जब तक आप बहुत अधिक पर संदेश के 'प्रकार' की जरूरत नहीं है के रूप में समान पृष्ठ।सब आप त्रुटि संदेश के लिए अपने खाके में एक अंतरिक्ष है, हालांकि, तो यह वास्तव में आसान है:

    from django.contrib.messages import error 
    
    def add_page(request): 
        error(request, 'test') 
        return redirect('page-index') 
    

    और फिर अपने आधार टेम्पलेट में, इस कहीं (शायद इस तुलना में अधिक जटिल की तरह एक ब्लॉक है, स्टाइल , यहां तक ​​कि):

    {% for message in messages %} 
        <p>{{ message }}</p> 
    {% endfor %} 
    

में दोनों सभी मामलों है, हालांकि, आप तर्क अपने urls.py से निकाल सकते हैं - केवल संदेश ही की राह घटक का हिस्सा बनने के लिए नहीं जा रहा है यूआरएल।

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 
+0

वहाँ एक रास्ता जानकारी के साथ एक दृश्य के कॉल करने के लिए है यूआरएल में नहीं thats? – Justus1

+0

हां, आप इसे पायथन में करते हैं - बस अपने add_page दृश्य से 'वापसी पृष्ठ_इंडेक्स (error_message =' test ') करें। –

+1

लेकिन यदि आप ऐसा करते हैं तो यूआरएल नहीं बदलेगा, आपने दूसरे दृश्य (पेज_इंडेक्स) की सामग्री को वर्तमान दृश्य (add_page) में वापस कर दिया है जो मेरे लिए एक खराब पैटर्न प्रतीत होता है। इसके अलावा, अपने स्वयं के सत्र-आधारित संदेश समाधान को रोल करने के बजाय मैं Django के अंतर्निर्मित [संदेश ढांचे] (https://docs.djangoproject.com/en/1) का उपयोग करने का सुझाव देता हूं।3/रेफरी/contrib/संदेश /) – Anentropic

0

redirect एक वास्तविक यूआरएल (यह एक HTTP रीडायरेक्ट, न सिर्फ एक अजगर कॉल है) पर पुन: निर्देशित किया है।

आपके यूआरएल conf में कोई 'error_message' सेगमेंट नहीं है, भले ही आपने इसे सेट अप किया हो ताकि डिफ़ॉल्ट रूप से फ़ंक्शन को kwarg के रूप में error_message के साथ बुलाया जा सके।

चूंकि यह आपका इंडेक्स पेज है और आप शायद यूआरएल में अतिरिक्त पथ सेगमेंट जोड़ना नहीं चाहते हैं तो आप इसे जीईटी वर्र्स का उपयोग करके इसे हॅक कर सकते हैं। जैसे

def page_index(request): 
    if 'error_message' in request.GET: 
     print request.GET['error_message'] 

from django.core.urlresolvers import reverse 

def add_page(request): 
    return redirect('%s?error_message=test' % reverse('page_index')) 

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 

अद्यतन:

के रूप में मैं घर चला गया, हालांकि अपने प्रश्न रीडायरेक्ट और kwargs आदि के बारे में है इस बारे में सोच रही थी, यकीनन बेहतर यहाँ विकल्प Django के messages framework का उपयोग करें और error_message पूरी तरह से छोड़ने के लिए होगा आपके विचार kwargs से बाहर, GET चरों आदि

जैसे

from django.contrib import messages 

def add_page(request): 
    messages.add_message(request, messages.ERROR, 'test') 
    return redirect('page_index') 

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

2

आप या तो प्रत्येक त्रुटि संदेश के लिए एक नामित यूआरएल ढांचा नहीं बनाते हैं, और, आर्ग dict में इसे पारित इस तरह किए जा सकेंगे:

url(r'^$', 'page_index', {'error_message': 'test'}, name='test_page_index'), 

या यदि आप वास्तविक URL में त्रुटि संदेश डाल करने के लिए तैयार हैं आप इस के लिए चुनते सकता है:

url(r'(?P"<"error_message">"\w+)/^$', 'page_index', name='page_index'), 

(कृपया निकालें "" आसपास "<" और ">", मैं सब कुछ है कि एक तरह लग रहा है लगता है कि उन्हें कोष्ठक में डाल करने के लिए किया था या वे प्रपत्र जवाब बाहर रखा जाएगा, एचटीएमएल टैग फ़िल्टर किए गए हैं)

और ध्यान में रखते हुए:

return redirect(reverse('page_index', args=['test']))