2 votes

Le formulaire de filtre de Django apparaît par défaut sous forme de liste déroulante ; changer pour une case à cocher

J'ai un modèle défini comme suit dans models.py

class ImageGrab(models.Model):
    title = models.CharField(max_length=50)
    slug=models.CharField(max_length=200)
    age=models.ForeignKey(Age, on_delete=models.CASCADE)
    gender=models.ForeignKey(Gender, on_delete=models.CASCADE)
    masked=models.ForeignKey(Mask, on_delete=models.CASCADE)
    withBackpack=models.ForeignKey(Backpack, on_delete=models.CASCADE)

Les filtres sont définis comme suit dans le fichier filters.py :

class ImageFilterAge(django_filters.FilterSet):
    class Meta:
        model = ImageGrab
        fields = ['age']

###others similar to this 

class ImageFilter(django_filters.FilterSet):
    class Meta:
        model = ImageGrab
        fields = ['age', 'gender', 'masked', 'withBackpack']

La vue est définie comme suit dans views.py

def images(request):
    imagelist = ImageGrab.objects.all()
    imagefilter = ImageFilter(request.GET, queryset=imagelist)
    agefilter = ImageFilterAge(request.GET, queryset=imagelist)
    genderfilter=ImageFilterGender(request.GET, queryset=imagelist)
    maskedfilter= ImageFilterMask(request.GET, queryset=imagelist)
    backpackfilter = ImageFilterBackpack(request.GET, queryset=imagelist) 
    return render(request, 'imglist.html', {'filter': imagefilter,'agefilter': agefilter.form, 'genderfilter':genderfilter.form, 'maskfilter':maskedfilter.form, 'backpackfilter':backpackfilter.form})

Mon modèle est le suivant, dans imglist.html

<form method="get" name="search" id="search">
    {{ agefilter }} <br>
    {{ genderfilter }} <br>
    {{ maskfilter }} <br>
    {{ backpackfilter }} <br>
</form>

Ce formulaire est rendu par défaut sous la forme d'un formulaire de sélection déroulant, comme indiqué dans l'image ci-dessous. Je souhaite le modifier en sélection multiple par case à cocher et/ou bouton radio pour les filtres. Filtrage à l'aide d'une liste déroulante

Comment procéder ?

Merci d'avance.

1voto

Raja Points 31

J'ai combiné les deux solutions données par les deux utilisateurs ci-dessus, et j'ai obtenu la solution suivante :

Filters.py :

age = ModelMultipleChoiceFilter(queryset=Age.objects.all(),widget=forms.CheckboxSelectMultiple())

Models.py

class Age(models.Model):
    ageChoices=(
        ('Child', 'Child'),
        ('Adult', 'Adult'),
        ('Old', 'Old'),
    )
    age = models.CharField(max_length=5, choices=ageChoices)

Ce qui est bien, c'est que les filtres semblent fonctionner correctement sur l'ensemble des données.

Merci aux utilisateurs Abdul Aziz Barkat & Vosem

enter image description here

0voto

Vosem Points 66

En voyant comment vos modèles sont configurés, vous pourriez vouloir créer un formulaire personnalisé django dans laquelle vous spécifiez les champs et la méthode de saisie pour chaque champ.

Toutefois, vous devriez peut-être aussi réfléchir à l'utilisation de clés étrangères pour des éléments aussi simples que l'âge, le sexe ou withBackpack. Vous devriez probablement utiliser d'autres types de champs, comme IntegerField ou BooleanField.

0voto

Abdul Aziz Barkat Points 13560

Vous pouvez personnaliser la génération du filtre en spécifiant filter_overrides dans les jeux de filtres Meta . Ainsi, pour votre utilisation, vous pouvez faire quelque chose comme ci-dessous pour définir CheckboxInput comme le widget à utiliser :

from django import forms
from django.db import models

class ImageFilterAge(django_filters.FilterSet):
    class Meta:
        model = ImageGrab
        fields = ['age']
        filter_overrides = {
            models.ForeignKey: {
                'filter_class': django_filters.ModelChoiceFilter,
                'extra': lambda f: {
                    'widget': forms.CheckboxInput,
                },
            },
        }

Vous pouvez également définir explicitement le champ de filtre afin de pouvoir spécifier son widget :

from django import forms

class ImageFilterAge(django_filters.FilterSet):
    age = django_filters.ModelChoiceFilter(queryset=Age.objects.all(), widget=forms.CheckboxInput)
    class Meta:
        model = ImageGrab
        fields = ['age']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X