IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

attribut html sur champ select/checkbox


Sujet :

Réseau/Web Python

  1. #1
    Membre éclairé Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Points : 707
    Points
    707
    Par défaut attribut html sur champ select/checkbox
    Bonjour à tous,

    je débute sur Python et Django (en auto-formation) et je bloque sur une mise en forme.

    J'ai une classe dans laquelle je veux définir une liste fixe. J'ai donc procédé selon ce que j'ai trouvé de la façon suivante dans le fichier models.py pour le champ "genre"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Personne(models.Model):
        GENRE = [('H','Homme'),('F','Femme')]
        nom = models.CharField(max_length=100)
        prenom = models.CharField(max_length=100, blank=True, null=True)
        dateNaissance = models.DateField(blank=True, null=True)
        genre = models.CharField(max_length=1, blank=True, null=True, choices=GENRE, default='Homme')
        coordonnees = models.OneToOneField(Coordonnees, on_delete=models.CASCADE, blank=True, null=True)
        adresse = models.OneToOneField(Adresse, on_delete=models.CASCADE, blank=True, null=True)
        onArchive = models.BooleanField(default=False, blank=True, null=True)
    Je définis mes champs via le fichier forms.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class PersonneForm(ModelForm):    
        class Meta:
            model = Personne
            fields = ['nom', 'prenom', 'genre', 'dateNaissance', 'coordonnees', 'onArchive']
            widgets = {
                'nom': TextInput(attrs={'class' : 'form-control'}),
                'prenom': TextInput(attrs={'class' : 'form-control'}),
                'dateNaissance': TextInput(attrs={'class' : 'form-control', 'type': 'date'}),
            }
    Extrait de mon fichier html:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
            <div class="col-md-6">
                        <div class="form-group">
                            <label>Prenom</label>
                            <div class="col-sm-9">
                                {{ form.prenom }}
                            </div>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-6">
                        <div class="form-group">
                            <label>Genre</label>
                            <div class="col-sm-9">
                                {{ form.genre }}
                            </div>
                        </div>
                    </div>
    Mon formulaire s'affiche bien, , mais je ne trouve pas comment spécifier l'attribut "form-control" pour le select. Du coup, ce champ n'est pas mis en forme. De plus, le champ onArchive, que je voudrais sous forme de checkbox, s'affiche comme un select.

    Je crois que j'ai besoin d'un peu d'aide.

    En vous remerciant pour vos retours.
    Question existentielle:
    "Pourquoi les portes des établissements ouverts 24h/24 ont-ils des serrures... O_o?"

  2. #2
    Membre éclairé Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Points : 707
    Points
    707
    Par défaut
    Citation Envoyé par keitaro_bzh Voir le message
    De plus, le champ onArchive, que je voudrais sous forme de checkbox, s'affiche comme un select.
    J'ai trouvé le pourquoi de la checkbox... Dans mon fichiers models.py
    jai le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onArchive = models.BooleanField(default=False, blank=True, null=True)
    En ne laissant que le default, j'obtiens bien ma checkboc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onArchive = models.BooleanField(default=False)
    Déjà un premier point de corrigé!
    Question existentielle:
    "Pourquoi les portes des établissements ouverts 24h/24 ont-ils des serrures... O_o?"

  3. #3
    Membre éclairé Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Points : 707
    Points
    707
    Par défaut
    Je progresse dans la résolution de mon incident
    Dans mon code initial, j'importais directement le ModelForm et le TextInput depuis django.forms

    Citation Envoyé par keitaro_bzh Voir le message
    Je définis mes champs via le fichier forms.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class PersonneForm(ModelForm):    
        class Meta:
            model = Personne
            fields = ['nom', 'prenom', 'genre', 'dateNaissance', 'coordonnees', 'onArchive']
            widgets = {
                'nom': TextInput(attrs={'class' : 'form-control'}),
                'prenom': TextInput(attrs={'class' : 'form-control'}),
                'dateNaissance': TextInput(attrs={'class' : 'form-control', 'type': 'date'}),
            }
    En parcourant certains forums, j'ai constaté que la procédure que je suivais allégeais le code j'imagine. En fait, il suffit d'importer le forms et d'aller chercher ModelForm et TextInput depuis le forms
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    from django import forms
    class PersonneForm(forms.ModelForm):    
        class Meta:
            model = Personne
            fields = ['nom', 'prenom', 'genre', 'dateNaissance', 'coordonnees', 'onArchive']
            widgets = {
                'nom': forms.TextInput(attrs={'class' : 'form-control'}),
                'prenom': forms.TextInput(attrs={'class' : 'form-control'}),
                'dateNaissance': forms.TextInput(attrs={'class' : 'form-control', 'type': 'date'}),
                'genre': forms.Select(attrs={'class' : 'form-control'}),
            }
    Ca fonctionne très bien.

    Sauf que je retombe sur un os dans le cas ou mon choix se porte une liste d'objet défini via un ForeignKey dans le view.py
    Pour pouvoir filtrer la liste de choix, je le fais depuis mon forms.py (exemple bidon mais pour illustrer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class PersonneForm(forms.ModelForm):
        genre = forms.ModelChoiceField(queryset=Genre.objects.filter(homme=1))
        class Meta:
          widget = {
            genre': forms.Select(attrs={'class' : 'form-control'}),
    }
    Ma liste est bien filtrée, mais mon champ n'est pas mis en forme...
    Question existentielle:
    "Pourquoi les portes des établissements ouverts 24h/24 ont-ils des serrures... O_o?"

  4. #4
    Membre éclairé Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Points : 707
    Points
    707
    Par défaut
    J'y suis presque!!!! A devenir fou ce monologue.. .

    Donc, en gros, il ne faut pas charger la liste dans le form.py, mais dans le models.py
    En gros, dans le models.py on va ajouter un limit_choices_to dans notre attribut ForeignKey (à la base un simple Charfiled, mais souvent, c'est lié à une liste filtrée dans la base).
    J'ai remplacé le genre par commune pour que ce soit plus parlant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Personne(models.Model):
        nom = models.CharField(max_length=100)
        prenom = ForeignKey(Genre,on_delete=models.PROTECT, limit_choices_to={'genre.abrege': 'F'})
        commune = models.ForeignKey(Commune,on_delete=models.PROTECT, limit_choices_to={'commune.cp': '35000'})
        dateNaissance = models.DateField(blank=True, null=True)
        genre = models.CharField(max_length=100, choices=GENRE, default='Homme')

    Et donc, dans le forms.py, il suffit de définir uniquement les attributs html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class PersonneForm(forms.ModelForm):
        class Meta:
          widget = {
            commune': forms.Select(attrs={'class' : 'form-control'}),
    }
    Bref, ça fonctionne bien puisque mon select est bien mis en forme sur mon formulaire HTML, et il liste bien toutes les communes ayant le code postal 35000.

    Me reste plus qu'une étape. Remplacer le '35000' en dur dans mon modèle par une variable afin que le chargement de la liste soit dynamique dans mon views.py (exemple bidon mais pour illuster)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def affiche_personne(request,cp):
        context = {
          'personne' = Personne()
          'form' = PersonneForm()
       }
    return render(request,'MyTresorerie/personne_form.html',context)
    Question existentielle:
    "Pourquoi les portes des établissements ouverts 24h/24 ont-ils des serrures... O_o?"

Discussions similaires

  1. Attribut onChange() sur un select
    Par stefde3 dans le forum jQuery
    Réponses: 9
    Dernier message: 08/10/2014, 19h08
  2. fonction sur champs select
    Par onirisme dans le forum Langage
    Réponses: 4
    Dernier message: 12/10/2007, 16h26
  3. 2 actions sur evenement onchange sur champ Select
    Par falz222 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/08/2006, 20h59
  4. [HTML] ReadOnly sur les <SELECT> ?
    Par nesbla dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 16/06/2005, 15h55
  5. Faire apparaître un champ texte en cliquant sur un select
    Par yoyot dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/03/2005, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo