2015-03-19 11 views
11

मैं Django के अंतर्निहित DeleteView का उपयोग करता हूं और मैंने success_url विशेषता के लिए एक मान असाइन किया है। अब मेरे टेम्पलेट में, मैं JQuery '$ .post() विधि के माध्यम से इस दृश्य को ट्रिगर करता हूं। जब आइटम हटा दिया जाता है, तो मुझे success_url पर रीडायरेक्ट नहीं किया जाता है। कुछ खोज के बाद, मैंने पाया कि यह AJAX पोस्ट विधि की समस्या प्रतीत होता है, जो पुनर्निर्देशन को अनदेखा करता है।Django में AJAX पोस्ट के बाद रीडायरेक्टिंग

मैं JQuery में $.post() के तीसरे पैरामीटर के रूप में window.location="#myRedirectionURL" स्थापित करने के लिए एक समारोह जोड़कर तय की।

हालांकि, इस तरह से बहुत Django नहीं लगता है। अनिवार्य रूप से, यह Django के बजाय AJAX के पहलू से समस्या हल करता है। और क्या है, यह हटाए गए व्यू में success_url छोड़ देता है (लेकिन आपको अभी भी success_url पर एक मान असाइन करना होगा, या Django एक त्रुटि उठाएगा)।

तो क्या आप AJAX के माध्यम से पोस्ट करते समय पुनर्निर्देशित करने का सही तरीका है? क्या ऐसा करने का कोई बेहतर तरीका है?

बहुत बहुत धन्यवाद।

+0

मैं 'setTimeout' देरी के साथ 'location.href =' # myRedirectionURL 'js कोड निष्पादित करता हूं,' हटाना ठीक था 'जैसे एक अच्छा संदेश दिखाते हुए' हटाना ठीक था ' – abidibo

उत्तर

12

अजाक्स पृष्ठों को रीडायरेक्ट नहीं करेगा!

आपको रीडायरेक्ट से क्या मिलता है वह पोस्ट प्रतिक्रिया पर डेटा ऑब्जेक्ट के अंदर नए पृष्ठ से HTML कोड है।

क्या आप जानते हैं जहाँ उपयोगकर्ता यदि जो कुछ भी कार्रवाई विफल रहता है रीडायरेक्ट करने के लिए, तो आप बस कुछ इस तरह कर सकते हैं:

सर्वर पर,

मामले में आप एक त्रुटि

response = {'status': 0, 'message': _("Your error")} 

है अगर सब कुछ ठीक हो गया

response = {'status': 1, 'message': _("Ok")} # for ok 

प्रतिक्रिया भेजें:

return HttpResponse(json.dumps(response), content_type='application/json') 
html पृष्ठ पर

:

$.post("{% url 'your_url' %}", 
     { csrfmiddlewaretoken: '{{ csrf_token}}' , 
      other_params: JSON.stringify(whatever) 
     }, 
     function(data) { 
      if(data.status == 1){ // meaning that everyhting went ok 
       // do something 
      } 
      else{ 
       alert(data.message) 
       // do your redirect 
       window.location('your_url') 
      } 
     }); 

आप जहां उपयोगकर्ता भेजने के लिए पता नहीं है, और आप सर्वर से कि यूआरएल पाने के लिए पसंद करते हैं, सिर्फ इतना है कि भेजने के एक पैरामीटर के रूप:

response = {'status': 0, 'message': _("Your error"), 'url':'your_url'} 

तो स्थानापन्न उस खिड़की स्थान पर:

alert(data.message) 
// do your redirect 
window.location(data.url) 
+0

आपने इसे मेरे लिए बहुत स्पष्ट कर दिया है। आपका बहुत बहुत धन्यवाद। तो AJAX कोड के माध्यम से रीडायरेक्ट करना (यदि आवश्यक हो तो Django दृश्य से JSON प्रतिक्रिया में यूआरएल पैरामीटर के साथ) इस समस्या को हल करने के लिए केवल सही है? तब मैं इसके साथ असहज महसूस नहीं करूंगा। –

0

शायद आप DeleteView की हटाएं() विधि को ओवरराइड करने का प्रयास कर सकते हैं और HttpResponseRedirect का उपयोग कर सकते हैं? मैंने इसे एक लेनदेन में कई विलोपन करने के लिए उपयोग किया है जब मुझे get_success_url को अनदेखा किया जा रहा था। (निम्नलिखित कोड का परीक्षण नहीं किया गया - केवल एक शुरुआती बिंदु के रूप में कार्य करने का विचार)

class DeleteRecord(views.DeleteView) : 
    model = models.Record 

    def delete(self, request, *args, **kwargs) : 
     super(DeleteRecord, self).delete(*args, **kwargs) 
     url = "http://whatever.your.url.is" 
     return HttpResponseRedirect(url) 
+0

लेकिन दृश्य को असीमित रूप से – abidibo

+0

कहा जाता है अजाक्स पृष्ठों को इसके एसिंक्रोनस कॉल को रीडायरेक्ट नहीं करेगा। हमें AJAX कॉल – kartheek

+0

की सफलता पर जेएस का उपयोग करके रीडायरेक्ट करने की आवश्यकता है, फिर भी इसे एक डिलीट विधि चलाने की आवश्यकता है, हालांकि इसे कहा जाता है। निश्चित रूप से यह DeleteView का पूरा बिंदु है। – ElPedro

3

http://hunterford.me/how-to-handle-http-redirects-with-jquery-and-django/

यह एक मेरे लिए काम करता है, शायद लग रहा है हैक की तरह

Django मिडलवेयर

from django.http import HttpResponseRedirect 

class AjaxRedirect(object): 
    def process_response(self, request, response): 
     if request.is_ajax(): 
      if type(response) == HttpResponseRedirect: 
       response.status_code = 278 
     return response 

जावास्क्रिप्ट

$(document).ready(function() { 
    $(document).ajaxComplete(function(e, xhr, settings) { 
     if (xhr.status == 278) { 
      window.location.href = xhr.getResponseHeader("Location"); 
     } 
    }); 
}); 
+0

धन्यवाद मिक्सो! इसने काम कर दिया.. – Sharath

0

के Django-ajax ajaxPost यदि आप एक सामान्य रीडायरेक्ट पारित रीडायरेक्ट के लिए अनुमति देता है (यूआरएल) (एक जेसन प्रतिक्रिया के रूप में)। Jquery AJAX() विधियों मेरे मामले में काम नहीं किया था।

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