django formes: valeurs par défaut pour les formulaires liés
Avec ce formulaire:
class Form(forms.Form):
name = forms.CharField(required=False, initial='Hello world')
Si je fais quelque chose comme cela dans la vue:
form = Form(request.GET)
if form.is_valid():
name = form.cleaned_data['name']
Alors la valeur initiale du nom est perdu, même si la demande de la.OBTENIR ne contient pas de name
en tant que clé. Est-il une solution de contournement? Je voudrais valeurs initiales de travail pour les formulaires liés comme des "valeurs par défaut".
OriginalL'auteur clime | 2013-04-15
Vous devez vous connecter pour publier un commentaire.
En modifiant légèrement Gonzalo de solution, c'est la bonne façon:
Si vous avez besoin de cela, vous pouvez avoir un coup d'oeil à django-filtre app. J'ai découvert assez récemment.
OriginalL'auteur clime
initial
n'est pas vraiment destiné à être utilisé pour définir par défaut valeurs pour les champs de formulaire.Au lieu de cela, il est vraiment plus un espace réservé à l'utilité lors de l'affichage des formes à l'utilisateur, et ne fonctionne pas bien si le champ n'est pas obligatoire (comme dans votre exemple).
Ce que vous pouvez faire est de définir un
clean_<fieldname>
méthode qui vérifie si il y a un vide de valeur pour ce champ et de retourner à la valeur par défaut:if not name:
. Que faire siname
a été défini dans la demande.Mais mis à la chaîne vide. Dans ce cas, la chaîne vide serait écrasé.J'ai pensé que c'est le comportement que vous voulais, je suis en train de modifier ma réponse à gérer ce cas 🙂
name
ne sera jamais Aucune. Même siname
n'est pas définie dans la requête.OBTENIR,cleaned_data['name']
sera une chaîne vide parce que le nom est un CharField. Et siname
est envoyé en tant que chaîne vide dans la demande.OBTENIR, c'est de toute façon une chaîne vide. Donc, vous ne pouvez pas faire la différence entre ces deux cas.OriginalL'auteur Gonzalo
J'utilise le schéma suivant pour la définition des valeurs par défaut en tant que valeurs initiales compte tenu de la forme-
Cela garantit que tous les champs qui ont une valeur initiale et de ne pas obtenir les valeurs à partir de l'utilisateur sont remplies par leur valeur initiale.
OriginalL'auteur Ramashish Baranwal
Ce travail:
OriginalL'auteur Akshar Raaj
Les solutions proposées, soit n'ont pas de travail pour moi ou juste ne semble pas très élégant. La documentation indique que la formation initiale ne fonctionne pas pour une forme liée, ce qui semble être l'original questionneurs (et mon) cas d'utilisation:
Ma solution est de voir si le formulaire doit être lié ou pas:
Vous pouvez également utiliser les autres moyens de l'initialisation de la forme (mentionné ci-dessus).
OriginalL'auteur Apollo Data
request.GET
est un dictionnaire comme objet.initial
ne fonctionne que dans le cas d'un formulaire indépendant.Formes ont un attribut nommé
data
. Cet attribut est fourni en première position argument ou comme undata
argument mot-clé au cours de la forme de l'initialisation.Les formulaires liés sont ceux dans lesquels vous fournir certaines données comme premier argument de la forme et du formulaire indépendant a
data
ensemble d'attributs qu'Aucun.Ici dans votre initialisation de la forme
form=Form(request.GET)
, vous fournissant la première position argument,data
attribut est défini sur la forme, et il devient une forme liée. Cela se produit même sirequest.GET
est un dictionnaire vide. Et puisque votre forme devient une forme liée de manièreinitial
dename
champ n'a pas d'effet sur elle.Ainsi, vous OBTENEZ la demande vous devez faire:
et votre
initial
dename
domaine serait un honneur.Ou, si vous voulez lire
name
de demande.OBTENIR et s'il n'y a alors envie de l'utiliser au lieu d'un champ initial puis avoir la suite de votre point de vue.cleaned_data et de validation doivent entrer en photo sur le POST de demande, pas sur. Pouvez-vous expliquer un peu plus sur ce que vous voulez?
OriginalL'auteur Akshar Raaj
Aucune des réponses ne fait exactement ce que les cieux demandé. Voici donc ma solution pour le même problème:
OriginalL'auteur Simanas