160 votes

Transformer un champ de formulaire Django en champ caché

J'ai un formulaire Django avec un RegexField qui est très similaire à un champ de saisie de texte normal.

À mon avis, dans certaines conditions, je veux le cacher à l'utilisateur, et j'essaie de garder le formulaire aussi similaire que possible. Quelle est la meilleure façon de transformer ce champ en un champ de type HiddenInput champ ?

Je sais que je peux définir des attributs sur le champ avec :

form['fieldname'].field.widget.attr['readonly'] = 'readonly'

Et je peux définir la valeur initiale souhaitée avec :

form.initial['fieldname'] = 'mydesiredvalue'

Cependant, cela ne changera pas la forme du widget.

Quelle est la meilleure façon / la plus "django" / la moins "bidouilleuse" de faire de ce champ un <input type="hidden"> champ ?

5voto

Zags Points 582

Si vous voulez que le champ soit toujours caché, utilisez ce qui suit :

class MyForm(forms.Form):
    hidden_input = forms.CharField(widget=forms.HiddenInput(), initial="value")

Si vous souhaitez que le champ soit masqué de manière conditionnelle, vous pouvez procéder comme suit :

form = MyForm()
if condition:
    form.fields["field_name"].widget = forms.HiddenInput()
    form.fields["field_name"].initial = "value"

1 votes

@Ashley Il est différent d'un point de vue critique. La réponse de ShayRybak n'indique pas comment ajouter une valeur à l'entrée cachée, ce que ma réponse fait.

0 votes

@Ashley C'était le cas. La question posée est "quelle est la façon la plus simple de créer un champ caché". Si le champ est toujours caché (comme stipulé dans ma réponse), il est de loin préférable de définir la valeur dans la définition du champ

1voto

DerekPK Points 69

Exemple de modèle :

models.py

from django.db import models

class YourModel(models.Model):
    fieldname = models.CharField(max_length=255, default="default")

Dans votre formulaire, vous pouvez ajouter des widgets avec ModelForm. Pour le rendre caché, ajoutez 'type': 'hidden' comme indiqué ci-dessous

0voto

{{ form.field}}
{{ form.field.as_hidden }}

avec ce format jinja, nous pouvons avoir à la fois des champs de formulaire visibles et des champs cachés.

0 votes

La solution à utiliser {{ form.field.as_hidden }} a déjà été donnée en cette réponse .

0voto

Amir jodat Points 196

Si vous voulez masquer et désactiver le champ pour protéger les données qu'il contient, comme d'autres l'ont mentionné, utilisez le widget hiddenInput et désactivez-le.

dans votre formulaire init

exemple :

        if not current_user.is_staff:
           self.base_fields['pictureValid'].disabled = True
           self.base_fields['pictureValid'].widget = forms.HiddenInput()

-3voto

user20310 Points 35

Vous pouvez simplement utiliser css :

#id_fieldname, label[for="id_fieldname"] {
  position: absolute;
  display: none
}

Cela rendra le champ et son étiquette invisibles.

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