POST后,为什么django formset内容没有更新?

时间:2014-11-20 09:46:19

标签: django forms

我正在使用formset向用户显示表单并更新我的数据库。成功后,我想立即使用更新(添加/删除)数据和额外的空表格重新显示formset。

数据库更新已正确完成。如果填写了额外的表格,则会显示回来。但是......在提交后仍然显示已删除的表单(行),如果额外的表单填充了数据,则在提交后没有新的额外表单可用...

这是我的view.py代码:


@login_required
def user_setting(request):
    user = request.user
    OnlineFormSet = modelformset_factory(Online, 
                                         can_delete=True,
                                         extra=1)

    onlines = Online.objects.filter(user=user).order_by('start')
    if request.method == 'POST':
        formset = OnlineFormSet(request.POST, queryset=onlines)
        if formset.is_valid():
            for q in formset.save(commit=False):
                q.user=user
                q.save()
    else:
        formset = OnlineFormSet(queryset=onlines)

    context['online_formset'] = formset

    return response(request, context)  

我还试图在if request.method == 'POST'块的末尾使用重定向,但没有成功......

是否有可能拥有一个全新的formset,其中包含因POST而刚被提交/删除的所有数据?

1 个答案:

答案 0 :(得分:0)

以下是我解决这个问题的方法......

首先,模板中出现错误,我将action=""更改为action="."

<form id="online" method="post" action=".">
    {% csrf_token %}
    {{ online_formset }}
<input id="online-submit" type="submit" value="Submit" />
</form>

我更新了view.py代码,因此它会重新创建基于相同查询集的表单集,即使之前发生过POST(因此也是保存)。

我在POST时创建了formset而不是限制在我用户的Online.objects.all()查询集时使用了onlines


@login_required
def user_setting(request):
    user = request.user
    OnlineFormSet = modelformset_factory(Online, can_delete=True,extra=1) 
    onlines = Online.objects.filter(user=user).order_by('start')
    if request.method == 'POST':
        formset = OnlineFormSet(request.POST, queryset=Online.objects.all())
        if formset.is_valid():
            for q in formset.save(commit=False):
                q.user=user
                q.save()
    formset = OnlineFormSet(queryset=onlines)
    context['online_formset'] = formset
    return response(request, context)

这样,我总是在更新后立即获得一个新版本。