0

我有一个表单,当我用数据提交它时引发内部服务器错误

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

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> 
4

1 回答 1

1

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

更新

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

您没有发布您的 javascript,因此我无法说明您是如何提交表单的,但这也可能是一个问题。如果您没有与 AJAX 帖子的其余部分一起提交该字段,无论出于何种原因,实际字段可能设置或不设置都无关紧要。

于 2012-05-10T16:28:46.993 回答