Q:

¿Cómo programar una selección masiva en listView? Django

Estoy programando un backend de ciudades en las que necesito añadirle una función de desactivar las ciudades que están marcadas, parecido a la funcionalidad propia de admin de Django.

Modelo City
class City(models.Model):
    name = models.CharField(max_length=50)
    country = models.ForeignKey(Country)
    region = models.ForeignKey(Region)
    cod_dane = models.CharField(max_length=8)
    desactivado = models.BooleanField(default=False)
    aereo = models.BooleanField(default=False)

    def __str__(self):
        return self.name

Formulario
class CityForm(forms.ModelForm):
    class Meta:
        model = City
        fields = ['id']

View
class CityView(ListView):
    model = City
    form_class = CityForm
    template_name = "backend/ciudad/ciudades.html"

    def post(self, request, *args, **kwargs):
        for r in request.POST.get('id'):
            ciudad = City.objects.get(id=r)
            ciudad.desactivado = True
            ciudad.save()
        return redirect('ciudades')

A:

Lo importante entender para lograr lo que quieres es tu formulario. Cuando creas el formulario de la forma que lo tienes, le estás diciendo a Django, "Hey, este formulario (CityForm) solo me va a funcionar para un modelo del tipo City" y el problema es que tu quieres afectar muchos modelos del tipo City para aplicarles luego el desactivado.
Entonces hay muchas formas de hacer que un solo formulario acepte muchos City para que puedas manipularlos en un for, una puede ser formsets, pero esta forma es mucho más rápida y menos compleja:
class DeactivateCityForm(forms.Form):  # No es ModelForm
    # al no se ModelForm no necesito definir una meta clase
    cities = forms.ModelMultipleChoiceField(queryset=City.objects.all())

De esta forma tienes un formulario que espera recibir desde el cliente bajo el parámetro de cities una lista de id del modelo City.
Y desde tu vista es mucho más fácil hacer update que un for, de esta forma:
class CityView(ListView):
    model = City
    form_class = DeactivateCityForm
    template_name = "backend/ciudad/ciudades.html"

    def post(self, request, *args, **kwargs):
        # no recuerdo si el form es pasado al método en algún momento
        # de este View, compruebalo, pero de no ser así, instancia el
        # formulario primero. Para eso lo creamos
        form = self.form_class(request.POST)
        if form.is_valid():
            cities = form.cleaned_data.get('cities', City.objects.none())
            cities.update(desactivado=True)
        return redirect('ciudades')

Si cualquier parte del código no te funciona, coméntame y te ayudare con el problema, no he probado el código que te he enviado así que no puedo decirte que funciona correctamente. Espero haberte ayudado

