Django मापदंडों के साथ पुनर्निर्देशित ()


83

मेरे दृश्य फ़ंक्शन में मैं एक और दृश्य कॉल करना चाहता हूं और इसके लिए डेटा पास करना चाहता हूं:

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

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

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

ऐसा लगता है कि मुझे 'कुछ-दृश्य-नाम' तर्क प्रदान करने की आवश्यकता है, लेकिन क्या यह केवल दृश्य फ़ंक्शन का नाम है, या url का नाम है? इसलिए मैं इसे django-registration में उसी तरह बनाना चाहूंगा, जैसे:

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', (), {})

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

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):

जवाबों:


66

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

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

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

और इसी तरह। इस मामले में, फ़ील्ड 1, फ़ील्ड 2 और फ़ील्ड 3 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))

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

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

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

उस ने कहा, यदि आप डेटा को स्टोर करना चाहते हैं, तो इसे सत्र में रखें:

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

और अगर मैं इस दृश्य में clean_data पर काम नहीं करूंगा, लेकिन बाद में उपयोग के लिए इसे पास कर दूंगा? मेरे पास साफ-सुथरी_दत्ता में कई क्षेत्र हैं, इसलिए मैं उन्हें एक स्ट्रिंग के रूप में पारित करने से बचना चाहूंगा :)
मंटू

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

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

हाँ हाँ हाँ यही है !! मैंने सत्रों के बारे में पूरी तरह से भूल जाने पर इस पर इतना समय बर्बाद किया है: / लानत, धन्यवाद !!
14

1
यदि URL की आवश्यकता नहीं है तो फ़ंक्शन को कॉल करने के बारे में अच्छा बिंदु।
मैक्सबेलेक

60

urls.py:

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

विचार

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