1

我不清楚如何在 Django 中管理表单集。这是我的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)以执行更新。

4

2 回答 2

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),)

注意extra=1modelformset_factory 行,它确保只有一个额外的空白表单。queryset=Ad.objects.all()在 else 语句中的第二个 newAdFormSet 中,它从 DB 中为 Ad 对象预填充表单,并在后端代码(大部分是隐藏的)字段中正确设置 PK 以识别提交的对象。

更新

如果你想设置Ad().codU指向一个User()实例,例如 request.user,你可以简单地设置它

instances = formset.save(commit=False)
for obj in instances:
    obj.codU = request.user
    obj.save()
于 2012-04-09T14:28:07.517 回答
0

我仍然不是 100% 清楚你的问题是什么,但听起来你根本不想要一个表单集。如果您只对一次添加或更新一条记录感兴趣,那么您需要一个简单的ModelForm,而不是表单集。所以:

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})
于 2012-04-09T15:11:49.010 回答