我认为我想要达到的目标并不难,但我不知道如何做到这一点hehehehe!
基本上我需要的是Django Admin中的功能,当你创建一个新对象时,如果你有一个外键,你可以添加新数据(打开一个弹出窗口),保存它然后然后自动选择框更新。
我所拥有的是这种形式:
我知道使用一些Javascript很容易做到,但我的观点是,Django有一些规则,据我所知,我无法将新数据添加到已创建的表单中,对吧?否则Django不会验证此表单。我怎么能实现这个目标?
PS:"本地"是我想要添加新数据的选择框。用户应该能够在此页面上创建新的Local,而不是转到另一个页面来执行此操作。谢谢:))
答案 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