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()
Ich habe auch ein Musterformular für das obige Modell wie folgt:
class JournalForm(ModelForm):
tank = forms.IntegerField(widget=forms.HiddenInput())
class Meta:
model = TankJournal
exclude = ('user','ts')
Ich möchte wissen, wie man den Standardwert für dieses versteckte Feld des Tanks einstellt. Hier ist meine Funktion zum Anzeigen / Speichern des Formulars bisher:
def addJournal(request, id=0):
if not request.user.is_authenticated():
return HttpResponseRedirect("https://stackoverflow.com/")
# 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/')
Sergej Golowtschenko
Sie können verwenden Initial was erklärt wird Hier
Sie haben zwei Möglichkeiten, entweder den Wert beim Aufrufen des Formularkonstruktors zu füllen:
form = JournalForm(initial={'tank': 123})
oder setzen Sie den Wert in der Formulardefinition:
tank = forms.IntegerField(widget=forms.HiddenInput(), initial=123)
Und wie ist diese Variable initial an die eigentliche Form weitergegeben? Müssen wir im eigentlichen Formularmodell als Parameter/Argument schreiben?
– mgPePe
4. Mai 11 um 12:03 Uhr
@bharal Es ist magisch. 😉 (Oder besser gesagt, Django-Formularkonstruktoren verstehen die spezielle “initial”-Variable und iterieren durch ihren Inhalt, ohne dass Sie etwas extra tun müssen). Persönlich ziehe ich es vor, Standardwerte in der Formulardefinition anzugeben und den initial=…-Mechanismus nur zu verwenden, wenn der gewünschte Standardwert ein dynamischer Wert ist (z. B. etwas, das von einem Benutzer eingegeben wurde, oder basierend auf seiner Anmeldung, seinem geografischen Standort usw.).
– Richard J. Foster
26. September 12 um 19:43 Uhr
Initial ist nicht Standard. Der Initialwert entfällt, wenn das Formular gebunden wurde:(.
– Klima
22. Juni 13 um 22:28 Uhr
Kommentieren Sie hier, um einen anderen Anwendungsfall zu erwähnen, bei dem diese Lösung des Anfangsparameters hilfreich ist: Wenn Sie beim Senden eines Registrierungslinks an jemanden die E-Mail/ID oder andere Anmeldeinformationen im Registrierungsformular vorab ausfüllen möchten, können Sie dies in diesem Fall nicht eintragen das Modell selbst als seine Dynamik, sondern Sie müssen den Konstruktor mit aufrufen Initial param wie von @umnik700 erwähnt. Funktioniert super!
– Keshav Agrawal
27. Mai ’14 um 6:45 Uhr
@Phlip: Nicht überschreiben View.get_form Anfangsdaten einzustellen. Jedes CBV mit einem FormMixin (im Grunde alle CBVs, die Daten erstellen oder bearbeiten) kann entweder eine Klassenebene verwenden initial Variable (für unveränderliche Standardwerte) oder Sie können sie überschreiben FormMixin.get_initial() um ein Diktat von Anfangswerten zurückzugeben, die an den Konstruktor des Formulars übergeben werden (für dynamische Standardwerte).
– GDorn
22. Oktober 15 um 20:00 Uhr
Andere Lösung: Setzen Sie die Initiale nach dem Erstellen des Formulars:
form.fields['tank'].initial = 123
Diese Arbeit für meinen Bedarf, nur ein Feld im Formular eingeben. Danke schön.
– bl4ckb1rd
13. April 18 um 18:40 Uhr
quux
Wenn Sie Modellform aus POST-Werten erstellen, können die Anfangswerte auf diese Weise zugewiesen werden:
form = SomeModelForm(request.POST, initial={"option": "10"})
@smido, ja die or None Teil benötigt wird. Wenn die Anfrage eine GET-Anfrage ist, ist request.POST ein leeres Wörterbuch, das anders behandelt wird als None in der Form-Init-Methode. Bitte lesen Sie die Django-Dokumentation.
– Bobort
23. Juli 21 um 16:34 Uhr
Ich hatte diese andere Lösung (ich poste sie, falls jemand anders als ich die folgende Methode aus dem Modell verwendet):
Der Initial Der Wert eines Felds soll in einem HTML angezeigt werden. Aber wenn der Benutzer diesen Wert löscht und schließlich einen leeren Wert für dieses Feld zurücksendet, wird die initial Wert geht verloren. Sie erhalten also nicht das, was von a erwartet wird Ursprünglich Verhalten.
Der Ursprünglich Verhalten ist : Der Wert, den der Validierungsprozess annehmen wird, wenn data Argument enthält keinen Wert für das Feld.
Um dies zu implementieren, besteht ein einfacher Weg darin, zu kombinieren initial und clean_<field>():
class JournalForm(ModelForm):
tank = forms.IntegerField(widget=forms.HiddenInput(), initial=123)
(...)
def clean_tank(self):
if not self['tank'].html_name in self.data:
return self.fields['tank'].initial
return self.cleaned_data['tank']
Ich bin auch auf die Notwendigkeit gestoßen, während der Entwicklung Standardwerte im Formular festzulegen. Meine Lösung ist
initial={"":""}
form=ArticleModel(request.POST)
if form.has_changed():
data = {i: form.cleaned_data[i] for i in form.changed_data}
data.update({key: val for key, val in init_praram.items() if key not in form.changed_data})
Verwenden Sie form.has_changed , wenn form.fields erforderlich ist, können Sie diese Methode verwenden