2012-11-06 15 views
12

मैं ताज़ा किए बिना अपना फॉर्म सबमिट करने के लिए AjaxForm प्लगइन का उपयोग कर रहा हूं। जैसे:Django - AJAX फ़ंक्शन के तहत संदेश कैसे दिखाएं

$('#my_form_id').ajaxForm(function(){ 

     //something on success or fail 
    }); 

यह सही ढंग से काम करता है। जब मैं सबमिट बटन पर क्लिक करता हूं तो यह रीफ्रेश किए बिना फॉर्म डेटा को सहेजता है। लेकिन इससे पहले; अगर पोस्ट सही ढंग से बचाया या कुछ में विफल रहा है कि इस कोड करता सूचनाएं प्रदर्शित कर रहा है

{% for message in messages %} 
    <div id="notice" align="center"> 
     {{ message }} 
    </div> 
{% endfor %} 

: मैं तरह मेरे टेम्पलेट फ़ाइल पर Django संदेशों था।

अब; मैं ऐसा नहीं कर सकता मैं समझ नहीं पा रहा हूं कि मैं AJAX कार्यों के साथ इन संदेशों टैग का उपयोग कैसे कर सकता हूं।

यह सिर्फ पोस्ट बचाता है। कोई सूचनाएं नहीं।

धन्यवाद।

संपादित करें:

add_post यूआरएल: url(r'^admin/post/add/$', view='add_post',name='add_post'),

संबंधित दृश्य:

@login_required(login_url='/login/') 
def add_post(request): 
    template_name = 'add.html' 
    owner = request.user 
    if request.method == "POST": 
     form = addForm(request.POST) 
     if form.is_valid(): 
      titleform = form.cleaned_data['title'] 
      bodyform = form.cleaned_data['body'] 
      checkform = form.cleaned_data['isdraft'] 

      n = Post(title=titleform, body=bodyform, isdraft=checkform, owner=owner) 
      n.save() 
      messages.add_message(request, messages.SUCCESS, 
       'New post created successfully!') 
     else: 
      messages.add_message(request, messages.WARNING, 
       'Please fill in all fields!') 
    else: 
     form = addForm() 
    return render_to_response(template_name, {'form': form, 'owner': owner,}, 
     context_instance=RequestContext(request)) 
+0

आपको अपना यूआरएल पेस्ट करना चाहिए और देखना चाहिए। – jpic

+0

यूआरएल जोड़ा और भाग देखें। – alix

उत्तर

10

ये उपकरण/विधियां हैं जो मुझे समस्या को हल करने में मदद करती हैं।

{% for message in messages %} 
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
{% endfor %} 

जब के जवाब में एक संदेश बना:

# `data` is a python dictionary 
def render_to_json(request, data): 
    return HttpResponse(
     json.dumps(data, ensure_ascii=False), 
     mimetype=request.is_ajax() and "application/json" or "text/html" 
    ) 

मैं पॉपअप संदेश (रों) के लिए आवश्यक एचटीएमएल रेंडर करने के लिए एक messages.html टेम्पलेट है: सबसे पहले, मैं एक सहायक उपयोगिता विधि render_to_json कहा जाता है एक AJAX अनुरोध, मैं data शब्दकोश में संग्रहीत एक स्ट्रिंग में संदेश (ओं) को पैकेज करने के लिए Django के render_to_string का उपयोग करता हूं, जो उचित प्रतिक्रिया देने के लिए मेरे render_to_json का उपयोग करता है:

def my_custom_view(request) 
    # ... your view code 
    data = { 
     'msg': render_to_string('messages.html', {}, RequestContext(request)), 
    } 
    return render_to_json(request, data) 

फिर, मेरी jQuery $.post(...) कॉलबैक फ़ंक्शन में, मैं अगर response वस्तु एक msg विशेषता है देखने के लिए जाँच करें, और तब डोम जहां मैं इसे jQuery बदलाव के साथ, होने के लिए अगर वांछित की जरूरत है चाहता हूँ में response.msg की सामग्री सम्मिलित।- यह अगर खाली है

<ul id="popup-messages-content"> 
    {% include 'messages.html' %} 
</ul> 

ध्यान दें कि उपरोक्त मामले जब आप एक वास्तविक पृष्ठ लोड (गैर AJAX अनुरोध) पर संदेश प्रदर्शित करना चाहते हैं के लिए messages.html में शामिल हैं: मेरे base.html टेम्पलेट संदेशों के लिए <ul> कंटेनर शामिल कोई संदेश नहीं है, लेकिन <ul> अभी भी AJAX- प्राप्त संदेशों को धक्का देने के लिए उपलब्ध है।

पिछले टुकड़ा जावास्क्रिप्ट समारोह है (jQuery की आवश्यकता है) मैं किसी भी $.post(...) कॉलबैक में उपयोग संदेशों को दिखाने के लिए:

function showPopupMessage(content) { 
    var elMessages = $('#popup-messages-content'); 
    if (elMessages.length && content) { 
     elMessages.html(content); 
    } 
} 
+0

यदि यह आपको आवश्यक उत्तर प्रदान करता है, तो क्या आप इसे इस तरह चिह्नित कर सकते हैं? धन्यवाद! –

+0

अच्छा, यह शर्मनाक है ... देर से प्रतिक्रिया के लिए खेद है। बस इसे स्वीकार कर लिया :) – alix

3

यहाँ एक सरल उपाय है।

layout.html में अपने संदेश के लिए एक प्लेसहोल्डर जोड़ें, यह जावास्क्रिप्ट में नए संदेश जोड़कर अनुमति देता है:

<div id="messages"> 
{% for message in messages %} 
    <div id="notice" align="center"> 
     {{ message }} 
    </div> 
{% endfor %} 
</div> 

बजाय:

{% for message in messages %} 
    <div id="notice" align="center"> 
     {{ message }} 
    </div> 
{% endfor %} 

add.html में, जोड़ने एक और एक जैसे:

{% if messages %} 
<ul class="hidden-messages" style="display:none"> 
    {% for message in messages %} 
     <div id="notice" align="center"> 
      {{ message }} 
     </div> 
    {% endfor %} 
</ul> 
{% endif %} 

और AJAXForm देखेंगे जैसे:

$('#your_form_id').ajaxForm({ 
    success: function(responseText) { 
     var newMessages = $(responseText).find('.hidden-messages').html(); 
     $('#messages').append(newMessages); 
    }, 
}); 
+0

हम्म। क्या आप मुझे कुछ समझाओ कोड लिख सकते हैं? मुझे यह सही ढंग से समझने के लिए? – alix

+0

अब मैं कोशिश कर रहा हूं। धन्यवाद – alix

5

मैं इसे here करने का एक आसान रास्ता मिल गया है, मैं उन विचारों में से कुछ ले लिया और यह मेरा परिणाम था:

तुम बस हमेशा की तरह और dicts की एक सूची में प्रतिक्रिया आप उन्हें डाल भेजने से पहले अपने संदेश बना:

django_messages = [] 

for message in messages.get_messages(request): 
    django_messages.append({ 
     "level": message.level, 
     "message": message.message, 
     "extra_tags": message.tags, 
}) 

तो फिर तुम किसी भी डेटा और आपके संदेशों को जोड़ने और इसे क्रमानुसार, जैसे:

data = {} 
data['success'] = success 
data['messages'] = django_messages 

return HttpResponse(simplejson.dumps(data), content_type="application/json") 
अंत में अपने ajax पर

:

success: function(data){ 
           success = data.success; 
           update_messages(data.messages); 
           if (success){ 
            ...                    
           } 
          }, 

और update_messages समारोह:

function update_messages(messages){ 
$("#div_messages").html(""); 
$.each(messages, function (i, m) { 
       $("#div_messages").append("<div class='alert alert-"+m.level+"''>"+m.message+"</div>"); 
      }); 

}

यह पूरी तरह से काम करता है और मुझे इसे

01 को लागू करने में बहुत आसानी से मिला
+1

क्या आपके 'm.div_messages' चर क्रमशः' m.level' और 'm.message' नहीं होना चाहिए? – sHtev

+0

क्या आप 'message.level' की बजाय' message.level_tag' नहीं चाहते हैं? – sHtev

+0

आप चर के बारे में सही हैं, कोड को अंग्रेजी में अनुवाद करते समय यह केवल एक गलती थी। Level_tag बनाम स्तर के बारे में मुझे यकीन नहीं है, मैं वास्तव में इसे अपने कोड पर उपयोग नहीं करता हूं। सुधार के लिए धन्यवाद। – steven2308

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