【问题标题】:form throwing a internal server error on submit with ajax, django表单在使用 ajax、django 提交时抛出内部服务器错误
【发布时间】:2012-05-10 16:11:59
【问题描述】:

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

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

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> 

【问题讨论】:

    标签: django forms submit internal-server-error


    【解决方案1】:

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

    更新

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

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

    【讨论】:

    • 好的,谢谢你清理了这么多,我的印象是这一行:form = RecipeForm(initial = {'original_cookbook' : request.user.cookbooks.all()[0 ]}) 是我为 original_cookbook 提供价值的地方。这个方法有问题吗?
    • 我明白你的意思......你能告诉我一个例子,说明在 data.success 上会发生什么,使用一个将对象添加到对象列表的表单?谢谢你的帮助克里斯。我已经为提交添加了我的 javascript
    • 我已将此标记为正确答案,我将开始一个新线程
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 2018-05-23
    • 2016-01-12
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多