我不清楚如何在Django中管理formset。这是我的views.py:
def newAd(request):
newAdFormSet = modelformset_factory(Ad)
if request.method == 'POST':
formset = newAdFormSet(request.POST, request.FILES)
if formset.is_valid():
formset.save()
return render_to_response('conf.html',
{'state':'Your ad has been successfull created.'},
context_instance = RequestContext(request),)
else:
formset = newAdFormSet()
return render_to_response('ad_form.html',
{'form':formset},
context_instance=RequestContext(request),)
它可以工作,但它总是返回每个现有元组的一个预填充形式,最后是一个空白表格。 现在,我无法得到如何说明必须返回一个空白表单(执行新插入),以及它必须返回一个预填充表单(可能传递广告ID)以执行更新。
答案 0 :(得分:4)
modelformset_factory和formset有助于解决很多问题,例如以代码为例
def newAd(request):
newAdFormSet = modelformset_factory(Ad, extra=1)
if request.method == 'POST':
formset = newAdFormSet(request.POST, request.FILES)
if formset.is_valid():
formset.save()
return render_to_response('conf.html',
{'state':'Your ad has been successfull created.'},
context_instance = RequestContext(request),)
else:
formset = newAdFormSet(queryset=Ad.objects.all())
return render_to_response('ad_form.html',
{'form':formset},
context_instance=RequestContext(request),)
注意modelformset_factory行中的extra=1
,它确保只有一个额外的空白表单。并且在else语句中的第二个newAdFormSet中queryset=Ad.objects.all()
,它预先填充来自DB的Ad对象的表单,并正确设置PK(大部分是隐藏的)字段,以便后端代码识别提交的对象。
更新
如果要将Ad().codU
设置为指向User()
实例,例如request.user,则只需按
instances = formset.save(commit=False)
for obj in instances:
obj.codU = request.user
obj.save()
答案 1 :(得分:0)
我仍然没有100%清楚你的问题是什么,但听起来你根本不想要一个formset。如果您只想一次添加或更新单个记录,则需要一个简单的ModelForm
,而不是一个formset。所以:
class AdForm(forms.ModelForm):
class Meta:
model = Ad
def add_update_ad(request, pk=None):
if pk is not None:
instance = Ad.objects.get(pk=pk)
else:
instance = Ad()
if request.POST:
form = AdForm(request.POST, instance=instance)
if form.is_valid():
new_instance = form.save()
return HttpResponseRedirect('my_confirmation_view')
else:
form = AdForm(instance=instance)
return render(request, 'ad_form.html', {'form': form})