Django par défaut les valeurs d'un formulaire
J'ai un Modèle comme suit:
class TankJournal(models.Model):
user = models.ForeignKey(User)
tank = models.ForeignKey(TankProfile)
ts = models.IntegerField(max_length=15)
title = models.CharField(max_length=50)
body = models.TextField()
J'ai aussi un modèle de formulaire pour le modèle ci-dessus comme suit:
class JournalForm(ModelForm):
tank = forms.IntegerField(widget=forms.HiddenInput())
class Meta:
model = TankJournal
exclude = ('user','ts')
Je veux savoir comment définir la valeur par défaut pour que le réservoir champ caché. Voici ma fonction pour afficher/enregistrer le formulaire jusqu'à présent:
def addJournal(request, id=0):
if not request.user.is_authenticated():
return HttpResponseRedirect('/')
# checking if they own the tank
from django.contrib.auth.models import User
user = User.objects.get(pk=request.session['id'])
if request.method == 'POST':
form = JournalForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
# setting the user and ts
from time import time
obj.ts = int(time())
obj.user = user
obj.tank = TankProfile.objects.get(pk=form.cleaned_data['tank_id'])
# saving the test
obj.save()
else:
form = JournalForm()
try:
tank = TankProfile.objects.get(user=user, id=id)
except TankProfile.DoesNotExist:
return HttpResponseRedirect('/error/')
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser initiale qui est expliqué ici
Vous avez deux options, soit de remplir la valeur lors de l'appel de constructeur:
ou définir la valeur dans la définition du formulaire:
initial
passé à la forme actuelle? Dans la forme actuelle du modèle, faut-il écrire en tant que paramètre/argument?default
argument mot-clé sur leField
constructeur... je ne peux pas trouver de la documentation pour elle maintenant... EDIT: je me suis trompé pour le ModelField de référence. FormFields ont pasdefaul
argumentform_class=
raccourci, sans explicitement un constructeur. Cela jette un monkeywrench dans la forme plus simple exemple de code. Des heures de plaisir primordialView.get_form
juste pour contourner ce "raccourci"View.get_form
à l'ensemble de données initial. Tout CBV avec un FormMixin (en gros tous les CBVs de créer ou de modifier des données) peut soit utiliser un niveau de classeinitial
variable (par immuable par défaut) ou vous pouvez remplacerFormMixin.get_initial()
retour d'un dict de valeurs initiales pour être passé à la forme du constructeur (dynamique par défaut.)initial
valeur est transmise à partir de la Forme de ses champs lorsque la forme des processus de ses données. Mais il ne fonctionnera pas si leinitial
valeur est None, parce que les vérifications sur le terrain comme ceif parsed_data is None and initial: ...
.Si vous créez modelform de valeurs POST initial peut être affecté de cette manière:
https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#providing-initial-values
or None
partie n'est pas vraiment nécessaire.Autre solution: Set initial après la création de la forme:
J'ai eu cette autre solution (je poste au cas où quelqu'un d'autre que moi, c'est à l'aide de la méthode suivante à partir du modèle):
Initial est défini sur la
__init__
fonctionself.fields['is_active'].initial = False