使用ajax,django在提交时抛出内部服务器错误

时间:2012-05-10 16:11:59

标签: django forms submit internal-server-error

我有一个表单,当我提交数据时会抛出内部服务器错误

它说这是由于完整性错误造成的:

IntegrityError at /cookbook/createrecipe/

(1048, "Column 'original_cookbook_id' cannot be null")

奇怪的是,我没有专栏original_cookbook_id - 我所拥有的是original_cookbook,它是食谱模型的外键

这是给出错误的视图:

def createrecipe(request):
        print "entering createrecipeview"
        if request.method == 'POST':
            print "form is a post"
            form = RecipeForm(request.POST)
            print form.errors
            if form.is_valid():
                print "form is valid"
                form = RecipeForm(initial = {'original_cookbook' : request.user.cookbooks.all()[0]})// this is where the error is being thrown
                form.save()

                t = loader.get_template('cookbook/create_form.html')
                c = RequestContext(request, {
                'form': form,
                })

                data = {
                'replace': True,
                'form': t.render(c),
                'success': True,
                }

                json = simplejson.dumps(data)
                return HttpResponse(json, mimetype='text/plain')
            else:
                print "form is invalid"
                form = RecipeForm(request.POST)
                t = loader.get_template('cookbook/create_form.html')
                c = RequestContext(request, {
                    'form':form,
                })

                data ={
                    'form': t.render(c),
                    'success': False,
                }

                json = simplejson.dumps(data)
                return HttpResponse(json, mimetype='text/plain')

我想我可能会以错误的方式宣布original_cookbook

其他任何人都有将_id附加到外键的经验/知道我如何能够解决这个问题

非常感谢

凯蒂

更新

这是我的javascript函数

<script type="text/javascript"> 

$(document).ready(function(){

    function hijack() {
        var form = $('form#createrecipeform');
        form.each (function(){
            this.reset();
            });
        form.submit(function(e) {
            e.preventDefault();
            console.log('ajax form submission function called successfully.');
            //form = $(this);
            console.log(form)
            var serialized_form = form.serialize();
            $.ajax({ type: "POST", 
                url: $(this).attr('action'),
                data: serialized_form, 
                success: (function(data) { 
                    console.log('ajax success function called successfully.');
                    data = $.parseJSON(data);
                    if (data.success) {
                        console.log('success');
                        //right now it is logging success to 
                        //console but nothing else is happening
                        //what else should happen on data success?
                    } else {        
                        console.log('failure');
                        var newForm = data.form;
                        form.replaceWith(newForm);
                        hijack();
                    }
                })
            });
            return false;
        });
    };

    hijack();

});
</script> 

1 个答案:

答案 0 :(得分:1)

您有一个original_cookbook_id字段。这就是外键的pk存储在表中的位置。 Django自动附加_id位。所有错误的意思是该字段设置为NOT NULL,并且您没有为original_cookbook提供一个值来填充它。

<强>更新

本身并没有什么“错误”,但需要注意几点。首先,initial仅设置表单中出现的初始值(显然足够)。但是,如果稍后由用户或某些其他操作将其设置为空,则它仍然为空,即initial对最终发布的数据没有真正的影响。

你没有发布你的javascript,所以我不能说你如何提交表格,但这也可能是一个问题。如果你没有用AJAX帖子的其余部分提交该字段,无论出于何种原因,实际字段可能设置或不设置为什么并不重要。