我正在使用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而刚被提交/删除的所有数据?
答案 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)
这样,我总是在更新后立即获得一个新版本。