使用Django formsets插入或更新数据

时间:2012-04-09 10:10:03

标签: django django-forms

我不清楚如何在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)以执行更新。

2 个答案:

答案 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})