【问题标题】:Django - ModelForm can_delete=True not working with M2M (through) modelDjango - ModelForm can_delete=True 不适用于 M2M(通过)模型
【发布时间】:2013-08-19 13:37:20
【问题描述】:

选中删除复选框时,提交表单时不会删除 LayerMapOptions 实例。否则,该表单对所有其他领域都适用。通过模型的形式有什么特别的吗?

型号:

class EzMap(models.Model):
    map_name = models.SlugField(max_length=50)
    layers = models.ManyToManyField(Shapefile, through='LayerMapOptions', verbose_name='Layers to display', null=True, blank=True)

class Shapefile(models.Model):
    filename = models.CharField(max_length=255)

class LayerMapOptions(models.Model):
    layer = models.ForeignKey(Shapefile)
    ezmap = models.ForeignKey(EzMap)
    position = models.IntegerField(max_length=100)
    visible = models.BooleanField()

查看:

def setMapOptions(request, map_name):
    map_selected = EzMap.objects.get(map_name=map_name, created_by=request.user)
    layers_ordered = LayerMapOptions.objects.filter(ezmap=map_selected).order_by('position')
    layerForm = modelformset_factory(LayerMapOptions, form=LayerMapOptionsForm, extra=0, can_delete=True)
        if request.POST:
            formset = layerForm(request.POST, queryset=layers_ordered)
            pk_list = request.POST.get("layersOrder")

            if formset.is_valid():
                for form in formset:
                    instance = form.instance
                    instance.position = pk_list.index(instance.pk)
                    instance.save()

            save_link = u"/ezmapping/map/%s" % (map_name)
            return HttpResponseRedirect(save_link)
        else:
            formset = layerForm(queryset=layers_ordered)
     return render_to_response("ezmapping/manage_map_Options.html", {'formset': formset}, context_instance=RequestContext(request))

表格:

class LayerMapOptionsForm(ModelForm):
    link = forms.CharField(label='link', required=False)

    def __init__(self, *args, **kwargs):
        super(LayerMapOptionsForm, self).__init__(*args, **kwargs)
        self.fields['link'].widget = ModelLinkWidget(self.instance.layer)

    class Meta:
        model = LayerMapOptions
        fields =  ['link', 'visible']

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您正在保存单个实例。相反,您需要在表单集上调用 save() 以触发自动删除所选项目。仔细阅读文档。

    https://docs.djangoproject.com/en/1.5/topics/forms/formsets/#can-delete

    如果您使用的是 ModelFormSet,当您调用 formset.save() 时,已删除表单的模型实例将被删除。另一方面,如果您使用的是普通的 FormSet,则由您来处理 formset.deleted_forms,可能在您的 formset 的 save() 方法中,因为没有关于删除表单的一般概念。

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 1970-01-01
      • 2011-11-16
      • 2013-09-16
      • 2015-07-25
      • 2014-12-28
      • 2022-01-22
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多