240 votes

Comment ajouter un espace réservé sur un CharField dans Django?

Prenez cet exemple de formulaire très simple par exemple :

class SearchForm(Form):
    q = forms.CharField(label='search')

Cela se retrouve rendu dans le template :

Cependant, je veux ajouter l'attribut placeholder à ce champ avec une valeur de Search afin que le HTML ressemble à quelque chose comme :

Idéalement, j'aimerais passer la valeur du placeholder à CharField dans la classe de formulaire à travers un dictionnaire ou quelque chose comme :

q = forms.CharField(label='search', placeholder='Search')

Quelle serait la meilleure façon d'accomplir cela ?

5voto

Viktor Johansson Points 191

La plupart du temps, je souhaite simplement que tous les espaces réservés soient égaux au nom verbeux du champ défini dans mes modèles

J'ai ajouté un mixin pour le faire facilement à n'importe quel formulaire que je crée,

class ProductForm(PlaceholderMixin, ModelForm):
    class Meta:
        model = Product
        fields = ('name', 'description', 'location', 'store')

Et

class PlaceholderMixin:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        field_names = [field_name for field_name, _ in self.fields.items()]
        for field_name in field_names:
            field = self.fields.get(field_name)
            field.widget.attrs.update({'placeholder': field.label})

2voto

cdosborn Points 1161

Il est indésirable de devoir savoir comment instancier un widget lorsque vous voulez simplement remplacer son espace réservé.

    q = forms.CharField(label='search')
    ...
    q.widget.attrs['placeholder'] = "Recherche"

2voto

class FormClass(forms.ModelForm):
    class Meta:
        model = Book
        fields = '__all__'
        widgets = {
            'field_name': forms.TextInput(attrs={'placeholder': 'Tapez le texte de l'espace réservé ici..'}),
        }

0voto

lber l Points 1

Après avoir examiné votre méthode, j'ai utilisé cette méthode pour la résoudre.

class Register(forms.Form):
    username = forms.CharField(label='Nom d\'utilisateur', max_length=32)
    email = forms.EmailField(label='Email', max_length=64)
    password = forms.CharField(label="Mot de passe", min_length=6, max_length=16)
    captcha = forms.CharField(label="Code de vérification", max_length=4)

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    for field_name in self.fields:
        field = self.fields.get(field_name)
        self.fields[field_name].widget.attrs.update({
            "placeholder": field.label,
            'class': "input-control"
        })

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