Django legt standardmäßige Formularwerte fest

Lesezeit: 5 Minuten

Django legt standardmasige Formularwerte fest
Mike

Ich habe ein Modell wie folgt:

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/')

Django legt standardmasige Formularwerte fest
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

1644129426 502 Django legt standardmasige Formularwerte fest
quux

Wenn Sie Modellform aus POST-Werten erstellen, können die Anfangswerte auf diese Weise zugewiesen werden:

form = SomeModelForm(request.POST, initial={"option": "10"})

https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#providing-initial-values

  • Dass or None Teil wird wirklich nicht benötigt.

    – schmido

    9. September 18 um 19:59 Uhr

  • @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):

class onlyUserIsActiveField(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(onlyUserIsActiveField, self).__init__(*args, **kwargs)
        self.fields['is_active'].initial = False

    class Meta:
        model = User
        fields = ['is_active']
        labels = {'is_active': 'Is Active'}
        widgets = {
            'is_active': forms.CheckboxInput( attrs={
                            'class':          'form-control bootstrap-switch',
                            'data-size':      'mini',
                            'data-on-color':  'success',
                            'data-on-text':   'Active',
                            'data-off-color': 'danger',
                            'data-off-text':  'Inactive',
                            'name':           'is_active',

            })
        }

Der Anfangsbuchstabe ist auf dem definiert __init__ funktionieren als self.fields['is_active'].initial = False

Django legt standardmasige Formularwerte fest
Timothe Delion

Wie in erklärt Django-Dokumente, initial ist nicht default.

  • 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']

1644129426 26 Django legt standardmasige Formularwerte fest
Walerij Boldakow

Ich hoffe, das kann dir helfen:

form.instance.updatedby = form.cleaned_data['updatedby'] = request.user.id

1644129427 978 Django legt standardmasige Formularwerte fest
xin.chen

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

.

793600cookie-checkDjango legt standardmäßige Formularwerte fest

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy