当前位置:  开发笔记 > 编程语言 > 正文

在Django中使ModelForm与ManyToMany关系与中间模型一起工作的步骤是什么?

如何解决《在Django中使ModelForm与ManyToMany关系与中间模型一起工作的步骤是什么?》经验,为你挑选了2个好方法。

如果你现在使用save方法,Django将尝试使用管理器(Django不允许)进行保存.不幸的是,你想要的行为比ModelForm默认情况下有点棘手.您需要做的是创建一个formset.

首先,您需要更改您的选项,ClientForm以便它不显示该groupes属性.

class ClientForm(ModelForm):
    class Meta:
        model = Client
        exclude = ('groupes',)

接下来,您必须更改视图以显示formset:

from django.forms.models import inlineformset_factory

def modifier(request, id):
    client = Client.objects.get(id=id)    
    form = ClientForm(instance = client)
    # Create the formset class
    GroupeFormset = inlineformset_factory(Client, Groupe)
    # Create the formset
    formset = GroupeFormset(instance = client)

    dict = {
        "form": form
        , "formset" : formset
        , "instance" : client
    }

    if request.method == "POST":
        form = ClientForm(request.POST, instance = client)
        formset = GroupeFormset(request.POST, instance = client)

        if form.is_valid() and formset.is_valid():
            client_mod = form.save()
            formset.save()

            id = client_mod.id
            return HttpResponseRedirect(
                "/client/%(id)s/?err=success" % {"id" : id}
            )
        else:
            return HttpResponseRedirect(
                "/client/%(id)s/?err=warning" % {"id" : id}
            )

    return render_to_response(
        "client/modifier.html"
        , dict
        , context_instance=RequestContext(request)
    )

显然,您还必须调整模板以呈现formset.

如果您需要有关formset的任何其他建议,请参阅以下文章:

模型formsets
Formsets



1> Ross Light..:

如果你现在使用save方法,Django将尝试使用管理器(Django不允许)进行保存.不幸的是,你想要的行为比ModelForm默认情况下有点棘手.您需要做的是创建一个formset.

首先,您需要更改您的选项,ClientForm以便它不显示该groupes属性.

class ClientForm(ModelForm):
    class Meta:
        model = Client
        exclude = ('groupes',)

接下来,您必须更改视图以显示formset:

from django.forms.models import inlineformset_factory

def modifier(request, id):
    client = Client.objects.get(id=id)    
    form = ClientForm(instance = client)
    # Create the formset class
    GroupeFormset = inlineformset_factory(Client, Groupe)
    # Create the formset
    formset = GroupeFormset(instance = client)

    dict = {
        "form": form
        , "formset" : formset
        , "instance" : client
    }

    if request.method == "POST":
        form = ClientForm(request.POST, instance = client)
        formset = GroupeFormset(request.POST, instance = client)

        if form.is_valid() and formset.is_valid():
            client_mod = form.save()
            formset.save()

            id = client_mod.id
            return HttpResponseRedirect(
                "/client/%(id)s/?err=success" % {"id" : id}
            )
        else:
            return HttpResponseRedirect(
                "/client/%(id)s/?err=warning" % {"id" : id}
            )

    return render_to_response(
        "client/modifier.html"
        , dict
        , context_instance=RequestContext(request)
    )

显然,您还必须调整模板以呈现formset.

如果您需要有关formset的任何其他建议,请参阅以下文章:

模型formsets
Formsets


是的,那实际上并不奏效.inlineformset_factory需要一个ForeignKey

2> Anber..:
…
if form.is_valid():
    client_mod = form.save(commit=False)
    client_mod.save()
    for groupe in form.cleaned_data.get('groupes'):
        clientgroupe = ClientGroupe(client=client_mod, groupe=groupe)
        clientgroupe.save()
    …


不要忘记删除db中存在但不在clean_data中的ClientGroupe实例,并且不要忘记在此表单中保存其他m2m字段.而且,我更喜欢将它放在ClientForm.save()方法中.
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有