我正在尝试使用jquery进行模型提交是Django,我收到500服务器响应并且不确定如何继续。
这是我的js:
function addUpdate(e) {
e.preventDefault();
var form = jQuery(e.target);
jQuery.ajax({
url: form.attr('action'),
type: form.attr('method'),
data: form.serialize(),
dataType: 'json',
success: function(){
$('<p>Been Added</p>').insertBefore("div.tr-list");
}
});
};
jQuery("form#tr-form").submit(function(e){
addUpdate(e);
});
这是我的表格:
<input class="nidden" type="button" id="tr-trigger" value="Add Resource" />
<form class="absolute" id="tr-form" action="{% url topic_resource_create topic.person.user topic.slug %}" method="POST">{% csrf_token %}
<div id="tr-wrapper">
{{ tr_form.as_p }}
<input id="tr-submit" type="submit" value="Submit" />
<input type="reset" value="Reset" />
</div>
</form>
这是我的观点:
def tr_create_xhr(request, slug):
if request.method == "POST":
form = TopicResourceForm(request.POST)
try:
r = Resource.objects.get(url=form.cleaned_data['resource'])
except Resource.DoesNotExist:
r = Resource.objects.create(url=form.cleaned_data['resource'], rtype=form.cleaned_data['rtype'])
r.save()
form.resource = r
topic = Topic.objects.get(person__user=request.user, slug__iexact=slug)
form.topic = topic
if form.is_valid():
form.save()
response = serializers.serialize('json', form)
if request.is_ajax():
return HttpResponse(response, content_type="application/javascript")
else:
return HttpResponseRedirect("../..")
我不确定他们是否认为逻辑是正确的,因为每次尝试发布到网址时我都会收到500服务器错误。我有几个其他类似的表单提交给我同样的错误。
答案 0 :(得分:1)
Firebug应该向您显示实际错误。但是,在这种情况下,问题可能出现在序列化代码中。您无法在表单上调用serializers.serialize
- 根本没有任何意义。序列化程序可以处理查询集。
您需要做的是从保存表单中获取返回的对象,将其包装在列表中,然后将其序列化:
obj = form.save()
response = serializers.serialize('json', [obj])
但是,您的视图流也存在一些问题 - 例如,如果表单无效,则没有对象。
答案 1 :(得分:0)
通常意味着找不到jquery文件。看看你的html标头的来源。应该是这样的,如果你按照链接,你应该看到jquery脚本。
<script type="text/javascript" src="/static/js/jquery-1.6.2.js"></script>
您的基本模板会有类似这样的内容
<script type="text/javascript" src="{{ STATIC_URL }}js/jquery-1.6.2.js"></script>
您可能还会发现documentation on static文件很有用。
答案 2 :(得分:0)
也许是因为csrf保护?症状非常相似。 https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/
因此,您可以尝试在{% csrf_token %}
和<form>
代码之间的某处添加</form>
。