2010-07-09 14 views
54

मेरे विचार समारोह में साथ मैं यह करने के लिए डेटा एक और दृश्य कॉल और पास करना चाहते हैं:Django वापसी रिडायरेक्ट() पैरामीटर

return redirect('some-view-name', backend, form.cleaned_data) 

, जहां बैकएंड registration.backends की है वस्तु, और form.cleaned_data एक dict है फॉर्म डेटा (लेकिन Don't mix *args and **kwargs in call to reverse()! त्रुटि को बढ़ाने से रोकने के लिए दोनों को या तो * args या ** kwargs के रूप में भेजा जाना चाहिए)। से मैं क्या डॉक्स में मिल गया है:

def my_view(request): 
    ... 
    return redirect('some-view-name', foo='bar') 

ऐसा लगता है कि मैं उपलब्ध कराने के लिए 'कुछ-दृश्य-नाम' तर्क की जरूरत है, लेकिन यह सिर्फ दृश्य समारोह का नाम, या यूआरएल का नाम है ?

to, args, kwargs = backend.post_registration_redirect(request, new_user) 
return redirect(to, *args, **kwargs) 

def post_registration_redirect(self, request, user): 
    return ('registration_complete',(), {}) 

ठीक है तो अब, मैं सीधे मेरे विचार फ़ंक्शन को कॉल करें या मैं इसके लिए एक यूआरएल प्रदान करने की आवश्यकता कर सकते हैं: तो मैं यह जिस तरह से यह Django पंजीकरण में किया जाता है, जहां के समान बनाने के लिए चाहते हैं? और और भी महत्वपूर्ण बात यह है कि कैसे मेरी funciotn कॉल (और यदि आवश्यक हो तो एक यूआरएल) दिखना चाहिए? दोनों बैकएंड, और cleaned_data को बाद में उपयोग के लिए इस दृश्य के माध्यम से पारित किया गया है। इस रूप में

url(r'^link/$', some-view-name) 
def some-view-name(request, *args): 

साथ ही:: मैं इस की कोशिश की है, लेकिन यह अनुचित है

return redirect('some_url', backend=backend, dataform.cleaned_data) 
url(r'^link/$', some-view-name)  
def some-view-name(request, backend, data): 

अभी भी NoReverseMatch। लेकिन Django पंजीकरण में, मैं कुछ इस तरह देखा है:

url(r'^register/$',register,{'backend': 'registration.backends.default.DefaultBackend'}, name='registration_register'), 

def register(request, backend, success_url=None, form_class=None, 
      disallowed_url='registration_disallowed', 
      template_name='user/login_logout_register/registration_form.html', 
      extra_context=None): 

उत्तर

52

सबसे पहले, अपने URL परिभाषा सब पर कोई पैरामीटर स्वीकार नहीं करता। यदि आप URL से दृश्य में पैरामीटर पारित करना चाहते हैं, तो आपको उन्हें urlconf में परिभाषित करने की आवश्यकता है।

दूसरा, यह स्पष्ट नहीं है कि आप cleaned_data शब्दकोश में क्या होने की उम्मीद कर रहे हैं। भूलें कि आप किसी पोस्ट पर रीडायरेक्ट नहीं कर सकते हैं - यह HTTP की एक सीमा है, न कि Django - इसलिए आपके cleaned_data को या तो URL पैरामीटर (भयानक) या थोड़ा बेहतर, जीईटी पैरामीटर की एक श्रृंखला होने की आवश्यकता है - तो यूआरएल फॉर्म में होगा:

/link/mybackend/?field1=value1&field2=value2&field3=value3 

और इसी तरह। इस मामले में, field1, field2 और field3 URLconf परिभाषा में शामिल नहीं हैं - वे request.GET के माध्यम से दृश्य में उपलब्ध हैं।

तो अपने urlconf होगा:

url(r'^link/(?P<backend>\w+?)/$', my_function) 

और देखने दिखाई देगा:

def my_function(request, backend): 
    data = request.GET 

और रिवर्स होगा (urllib आयात करने के बाद):

return "%s?%s" % (redirect('my_function', args=(backend,)), 
        urllib.urlencode(form.cleaned_data)) 

टिप्पणी के बाद संपादित

रीडायरेक्ट और रिवर्स का उपयोग करने का पूरा बिंदु, जैसा कि आप कर रहे हैं, यह है कि आप यूआरएल पर जाते हैं - यह एक एचटीपी कोड देता है जो ब्राउज़र को नए यूआरएल पर रीडायरेक्ट करने का कारण बनता है, और उसे कॉल करता है।

यदि आप बस अपने कोड के भीतर से दृश्य को कॉल करना चाहते हैं, तो बस इसे सीधे करें - बिल्कुल विपरीत उपयोग करने की आवश्यकता नहीं है।

जिसके अनुसार, अगर सभी आप क्या करना चाहते डाटा स्टोर है, तो बस यह सत्र में डाल:

request.session['temp_data'] = form.cleaned_data 
+0

और यदि मैं इस दृश्य में cleaned_data पर काम नहीं करूंगा, लेकिन इसे बाद में उपयोग के लिए पास कर दूं? मेरे पास cleaned_data dict में कई फ़ील्ड हैं इसलिए मैं उन्हें स्ट्रिंग स्ट्रिंग के रूप में पास करने से बचना चाहता हूं :) – muntu

+0

मुझे यह टिप्पणी समझ में नहीं आ रही है। यदि आवश्यक हो तो अपने प्रश्न को अपडेट करने के लिए कृपया अधिक विस्तार से समझाएं। –

+0

यह दूसरा दृश्य केवल इस भेजे गए डेटा को और उपयोग के लिए संग्रहीत करेगा। लेकिन क्या आपको यकीन है कि मुझे इसके लिए यूआरएल प्रदान करने की ज़रूरत है? दस्तावेज़ों से ऐसा लगता है कि मैं सिर्फ दृश्य को सीधे कॉल कर रहा हूं। इसके अलावा मैं उम्मीद कर रहा था कि रीडायरेक्ट() में बैकएंड और डेटा के साथ एक डिक्शनरी भेजना (जैसा कि यह डीजेंगो-पंजीकरण में किया जाता है) और फिर यूआरएल में (इस फंक्शन को रजिस्टर फ़ंक्शन में), लेकिन जो मुझे लगता है उससे असंभव है? – muntu

29

urls.py:

#...  
url(r'element/update/(?P<pk>\d+)/$', 'element.views.element_update', name='element_update'), 

views.py:

from django.shortcuts import redirect 
from .models import Element 


def element_info(request): 
    # ... 
    element = Element.object.get(pk=1) 
    return redirect('element_update', pk=element.id) 

def element_update(request, pk) 
    # ... 
संबंधित मुद्दे