2012-12-03 17 views
5

मैं अजाक्स और Django दोनों के लिए एक नौसिखिया हूँ। प्रश्न को सरल बनाने के लिए मान लें कि मेरे पास एक छिपी हुई फॉर्म और दो वस्तुएं हैं, और मैं उपयोगकर्ताओं से वस्तुओं की कुछ स्थिति पर क्लिक करने के लिए कहता हूं। प्रत्येक क्लिक फॉर्म के एक हिस्से को भरता है। मैं चाहता हूं कि फॉर्म प्रत्येक ऑब्जेक्ट के लिए एक बार भर जाए। तो कुल मिलाकर दो बार। जब फॉर्म पहले विषय के लिए भर जाता है, तो मैं पृष्ठ को रीफ्रेश किए बिना, सर्वर पर अजाक्स के माध्यम से फ़ॉर्म भेजना चाहता हूं, और दूसरी ऑब्जेक्ट के लिए फ़ॉर्म को फिर से भरने की अनुमति देता हूं। हालांकि, किसी कारण से मैं फॉर्म को अजाक्स के माध्यम से नहीं भेज सकता। index.html:AJAX और DJANGO फॉर्म

<html> 
<body> 
<script src="{{ STATIC_URL }}prototype.js"></script> 
<script src="{{ STATIC_URL }}jquery.js"></script> 
<script> 

    objectID= 1; 
    num_obj = {{num_obj}} 

    function ajax_post(){ 
    $('#inputform').submit(function() { 
     $.ajax({ 
      type: 'POST', 
      url: '/index/', 
      data: $(this).serialize(), 
      success: function(data){alert(data)} 

     }); // end new Ajax.Request 
    }); 
    } 


function onDocumentMouseDown(event) { 
     ....do stuff 
     if (objectID < num_obj){ 
      ajax_post() 
      } 
     if (objectID == num_obj){ 
      $("form").submit();} 
     objectID ++; 
     $("form").clearForm(); 
     document.forms[0].ObjectID.value = objectID; 
     } 
    </script> 
    <form action="" method="post" id="inputform"> 
     <div id="ajaxwrapper"> 
     {% csrf_token %} 
     <table> 
     {{ form.as_table }} 
     </table> 
    </div> 
    </form> 
</body> 
</html> 

मेरी view.py:

from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import * 
from firstapp.forms import PracForm3 

num_obj=2 

def index(request): 
    Obj.objects.all().delete() 
    if request.method == 'POST': 
    form = PracForm3(request.POST) 
    print "\n\n\n\n\n" 
    if request.is_ajax(): 
     print "yaaaaay AJAX" 
     print request.POST 
    else: 
     print "noooooo" 
    print "\n\n\n\n\n" 
    if form.is_valid(): 
     cd = form.cleaned_data 
     ..... 
     if cd['ObjectID'] == num_obj: 
     return HttpResponseRedirect('/submit') 
    else: 
    form = PracForm3() 
    dic = {'form': form, 'num_obj': num_obj, ...} 
    return render_to_response('index.html', dic, context_instance=RequestContext(request)) 

मेरी urls.py:

यहाँ मेरी कोड है

from django.conf.urls import patterns, include, url 
from firstapp.views import index, submit 
from django.conf import settings 

urlpatterns = patterns('', 
('^index$', index), 
('^submit$', submit), 
) 
किसी कारण से

, मेरे अजाक्स किसी को भी काम नहीं करता जानता है कि मैं क्या गलत कर रहा हूं?

+0

क्या आप इस मामले पर अधिक जानकारी प्रदान कर सकते हैं? आप ब्राउज़र के डेवलपर कंसोल (मैं क्रोम की अनुशंसा करता हूं) का उपयोग कर सकता हूं और आपको देखे गए किसी भी त्रुटि या अनुरोध पेस्ट कर सकता हूं। –

+0

मुझे कोई त्रुटि या अनुरोध नहीं दिख रहा है। मुझे यकीन नहीं है कि AJAX सभी – user1871528

+0

पर पोस्ट कर रहा है क्या आप सीएसआरएफ के लिए लेखांकन कर रहे हैं? – esse

उत्तर

0

आप अपने AJAX कॉल में /index/ का अनुरोध कर रहे हैं, लेकिन आपका पैटर्न /index से मेल खाता है।

+0

मैंने यूआरएल बदल दिया: '/ index /' से url: '/ index' अभी भी काम नहीं कर रहा है – user1871528

3

यह शायद AJAX पोस्ट के लिए सीएसआरएफ से संबंधित है, आपको प्रत्येक POST अनुरोध के साथ सीएसआरएफ टोकन को POST डेटा के रूप में पास करना याद रखना होगा। आपको यह कोड here जोड़ने की आवश्यकता हो सकती है, जो Django दस्तावेज़ हैं जो Django + CSRF + AJAX के बारे में बात करते हैं।

मुझे आपके Django दृश्य में नोटिस है कि आप "सबमिट" पर रीडायरेक्ट कर रहे हैं आमतौर पर AJAX के साथ मैं एक अलग यूआरएल पर रीडायरेक्ट नहीं करता, मैं एक HttpResponse का उपयोग करता हूं और कुछ स्ट्रिंग मान, जैसे JSON वापस देता हूं। मुझे यह भी नहीं पता कि आपके पास अपने विचार में प्रिंट स्टेटमेंट क्यों हैं, जब तक आप डीबगर में उस दृश्य में नहीं जा रहे हैं। परीक्षण/डिबगिंग के लिए आपके पास एक वैरिएबल होना चाहिए जिसमें आप कुछ स्ट्रिंग असाइन करें, और फिर उसे अपने AJAX पर वापस पास करें। फिर अपने अजाक्स में आप दृश्य से संदेश पढ़ सकते हैं, ऐसा कुछ।

... 
success: function(data){alert(data)}, 

error: function(data){alert(data)} 
...   
:

def index(request): 
    ... 
    if request.is_ajax(): 
     msg = 'it worked' 
    else: 
     msg = 'i am sad' 
    return HttpResponse(msg) 
    ... 

इसके अलावा, आप जावास्क्रिप्ट को सफल और ajax कॉल में त्रुटि समारोह होना चाहिए, आप केवल सफलता ताकि आप त्रुटियों को पकड़ने नहीं कर रहे हैं, देखने बालक थोड़ा अपने जावास्क्रिप्ट इस प्रकार दिखाई देगा दिया है

ऐसा लगता है कि आपके पास कई समस्याएं हो सकती हैं। यदि आपने सीएसआरएफ सामान नहीं किया है जो मैंने आपको दिया है तो यह भी एक मुद्दा है, परीक्षण के लिए csrf_exempt का उपयोग करने के लिए यदि आप इसे पसंदीदा तरीके से संबोधित नहीं करना चाहते हैं। उपरोक्त कोड बिट्स आज़माएं और देखें कि क्या यह आपके लिए प्रगति करता है।

0

यह csrf के कारण हो सकता है, विधि नाम उपयोगी होने से पहले @csrf_exempt जोड़ें।

@csrf_exempt 
def method(args): 
    pass 
+0

इससे मदद नहीं मिली। – user1871528

0

मैंने सीएसआरएफ पर टिप्पणी की, इसलिए यह नहीं था कि मेरा AJAX फ़ंक्शन समस्या थी। यहाँ सही तरीका है: अपने सभी इनपुट

1

CSRF टोकन $('#input-form') पोस्ट अनुरोध में शामिल है के लिए

function ajax_post(){ 
    $.ajax({ 
     type: 'POST', 
     url: '/index/', 
     data: $(this).serialize(), 
     success: function(data){alert(data)} 

    }); // end new Ajax.Request 
} 

धन्यवाद, इसलिए मुझे नहीं लगता कि कि मुद्दा था। मुझे लगता है कि समस्या यह है कि आप अपने विचार में संदर्भ को जेसन में परिवर्तित नहीं कर रहे हैं।यह docs example से है:

import json 
from django.http import HttpResponse 

class JSONResponseMixin(object): 
    """ 
    A mixin that can be used to render a JSON response. 
    """ 
    response_class = HttpResponse 

    def render_to_response(self, context, **response_kwargs): 
     """ 
     Returns a JSON response, transforming 'context' to make the payload. 
     """ 
     response_kwargs['content_type'] = 'application/json' 
     return self.response_class(
      self.convert_context_to_json(context), 
      **response_kwargs 
     ) 

    def convert_context_to_json(self, context): 
     "Convert the context dictionary into a JSON object" 
     # Note: This is *EXTREMELY* naive; in reality, you'll need 
     # to do much more complex handling to ensure that arbitrary 
     # objects -- such as Django model instances or querysets 
     # -- can be serialized as JSON. 
     return json.dumps(context) 
संबंधित मुद्दे