Django - 在Form中创建新对象,更新选择框并保存

时间:2016-05-18 14:51:37

标签: django django-models django-forms django-views

我认为我想要达到的目标并不难,但我不知道如何做到这一点hehehehe!

基本上我需要的是Django Admin中的功能,当你创建一个新对象时,如果你有一个外键,你可以添加新数据(打开一个弹出窗口),保存它然后然后自动选择框更新。

我所拥有的是这种形式:

enter image description here

我知道使用一些Javascript很容易做到,但我的观点是,Django有一些规则,据我所知,我无法将新数据添加到已创建的表单中,对吧?否则Django不会验证此表单。我怎么能实现这个目标?

PS:"本地"是我想要添加新数据的选择框。用户应该能够在此页面上创建新的Local,而不是转到另一个页面来执行此操作。谢谢:))

2 个答案:

答案 0 :(得分:1)

您的问题在这里:

  

我无法将新数据添加到已创建的表单中,对吧?否则Django不会验证此表单。我怎么能做到这一点?

然后答案:

你是对的,django会检查值匹配表格值规则。的

意识到你的主窗体被调用了两次:在GET和POST上。在两个表单执行之间,您可以对新表单进行数据库值更改。这意味着在第二个主窗体调用中,可以使用添加到数据库的值:

field1 = forms.ModelChoiceField(queryset=  ***1*** )

***1***:在第二次调用时,field1上已有新值。

然后,您不应该害怕这个主题,新的价值将在主表单POST请求的表单中提供。

答案 1 :(得分:0)

使用javascript更新值没有错,只要新组合框中的键在数据库中有正确的键,那么它应该没问题。

保存最后一个条目后调用此函数。

function refreshLocal(){
    $.get(window.location.href, '', function(html){
        // change the id to the local combox's id
        var serverLocalDropBox = $(html).find('#id_local');   
        if (serverLocalDropBox.length){
            $('#id_local').replaceWith(serverLocalDropBox);
        }
    })
}

如果您不想使用javascript解决方案,可以发布带有刷新标记的表单,如果您看到该标志只是不验证并按原样返回表单,则可以在服务器端发布。由于您在foreignkey中有一个新条目,它将自动更新查询集以包含新条目。

function serverRefreshLocal(){
        var $form = $('#your_form_id');
        $form.append('<input type="hidden" name="refresh" value="true" />');

        // you can use ajax submit and ajax refresh here if you don't want to leave the page
        $form.submit();
    }

//服务器端

def your_form_post_view(request):

    if request.POST.get('refresh', 'false') == 'true':
        # initial is the trick to save user input
        your_form = YourForm(initial=request.POST)
        context = {
            'form': your_form,
        }
        return render(request, 'your_template.html', context)

    # your view code goes here