我有一個名爲Item的模型,我試圖用Ajax創建項目,一切看起來都工作正常,但我得到並在過程結束時出錯,在Ajax中的成功功能。我一直在閱讀了很多答案的問題,問題是在StackOverflow的,但我不能讓它工作:返回數據中的Django + Ajax錯誤
這是我的模型:
PRIORITY_CHOICES = (
(1, 'Low'),
(2, 'Normal'),
(3, 'High'),
)
class Item(models.Model):
name = models.CharField(max_length=60)
description = models.TextField(max_length=1000)
created = models.DateTimeField(auto_now_add=True)
priority = models.IntegerField(choices=PRIORITY_CHOICES, default=1)
done = models.BooleanField(default=False)
meeting = models.ForeignKey(Meeting)
def __str__(self):
return self.name
這是我的看法,偉馳好的工作和保存數據到數據庫中去:
from .forms import AddItemForm
from .utils import render_to_json_response
class AjaxFormResponseMixin(object):
def form_invalid(self, form):
return render_to_json_response(form.errors, status=400)
def form_valid(self, form):
# save
self.object = form.save()
# initialize an empty context
context = {}
# return the context as json
return render_to_json_response(self.get_context_data(context))
class AjaxItemCreateView(AjaxFormResponseMixin, CreateView):
form_class = AddItemForm
def get_context_data(self, context):
context['success'] = True
context['name'] = self.object.name
context['description'] = self.object.description
return context
,你可以看到,我使用了一個名爲render_to_json_response自定義快捷鍵,以用JSON
解析數據,這是代碼快捷方式(請注意,我打印的背景下,爲了驗證數據):
from django.http import JsonResponse
def render_to_json_response(context, **response_kwargs):
print (context)
return JsonResponse(context)
(如果你想知道爲什麼我使用這個簡單的快捷鍵是因爲以前我是想返回與HttpResponse對象,並指定CONTENT_TYPE =「應用/ JSON」響應,但也有人不工作)
這是我的Ajax代碼:
function AddItem(event){
var csrftoken = getCookie('csrftoken');
var item_name = $('#item-name').val();
var item_desription = $('#item-description').val();
var item_priority = $('#item-priority').val();
var item_meeting_pk = $('#item-meeting-pk').val();
var url = "/item/add/";
$.ajax({
type: "POST",
url: url,
data: {
'name': item_name,
'description': item_desription,
'priority': item_priority,
'meeting': item_meeting_pk ,
'csrfmiddlewaretoken': csrftoken
},
success: function(data){
alert("success");
alert(data);
},
complete: function(data){
alert("completed");
alert(JSON.stringify(data));
}
});
}
,最後,這是調用形式AddItem()函數:
<form>
{% csrf_token %}
<input type="text" placeholder="Nombre del item" id='item-name'/>
<input type="text" placeholder="Descripción del item" id='item-description'/>
<select id="item-priority" name="provider" class="form-control">
<option value="1">Baja</option>
<option value="2">Normal</option>
<option value="3">Alta</option>
</select>
<input type='hidden' id='item-meeting-pk' value='{{ meeting.pk }}'>
<button onclick='AddItem()' class="button-blue" >Agregar</button>
</form>
當我提交表單,一切順利,在我的Django的殼,我可以看到POST請求返回200和數據確定打印:
{'name': 'asdkkasd', 'description': 'sdksdksjd', 'success': True}
[29/Aug/2015 08:34:22]"POST /item/add/ HTTP/1.1" 200 65
在AJAX功能我
在成功和完整的JavaScript警告,但只有完整的一個是執行,這就是我與警報的執行(JSON.stringify(數據));:
{"readyState": 0, "responseText":"", "status":0, "statusText": "error"}
我希望你能得到幫助我,謝謝你:)
確切地說,在響應200上調用成功,並且正如你在我的django服務器中看到POST請求返回200,但成功函數沒有執行 –
一個non- 200響應更可能是導致此行爲的原因。檢查服務器代碼返回的狀態是什麼。在那裏有一個打印語句。 – cafebabe1991
好吧,我看到你有200迴應。 – cafebabe1991