1

When the delete checkbox is checked, the LayerMapOptions instance is not deleted when the form is submitted. Otherwise the form is working perfectly for all other fields. Is there something special to do in the form for through model?

model:

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

view:

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

form:

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']
Below the Radar
  • 7,321
  • 11
  • 63
  • 142

1 Answers1

1

You are saving single instances. Instead you need to call save() on the formset to trigger automatic removal of selected items. Read docs more carefully.

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

If you are using a ModelFormSet, model instances for deleted forms will be deleted when you call formset.save(). On the other hand, if you are using a plain FormSet, it’s up to you to handle formset.deleted_forms, perhaps in your formset’s save() method, as there’s no general notion of what it means to delete a form.

mariodev
  • 13,928
  • 3
  • 49
  • 61