Ich habe ein Formular mit einer E-Mail-Eigenschaft.
Bei Verwendung {{ form.email }}
im Falle eines Validierungsfehlers rendert Django weiterhin den vorherigen Wert im Wertattribut des Eingabe-Tags:
<input type="text" id="id_email" maxlength="75" class="required"
value="[email protected]" name="email">
Ich möchte das Eingabe-Tag selbst rendern (um im Fehlerfall JavaScript-Code und eine Fehlerklasse hinzuzufügen). Zum Beispiel ist dies meine Vorlage anstelle von {{ form.email }}
:
<input type="text" autocomplete="on" id="id_email" name="email"
class="email {% if form.email.errors %} error {% endif %}">
Dies zeigt [email protected]
dem Benutzer jedoch nicht den fehlerhaften Wert ( in diesem Beispiel) an.
Wie erhalte ich den Feldwert in der Vorlage?
django
django-templates
Eran Kampf
quelle
quelle
Antworten:
Dies war eine Funktionsanforderung, die in Django 1.3 behoben wurde.
Hier ist der Fehler: https://code.djangoproject.com/ticket/10427
Wenn Sie etwas nach 1.3 ausführen, können Sie in Django-Vorlagen grundsätzlich Folgendes tun:
{{ form.field.value|default_if_none:"" }}
Oder in Jinja2:
{{ form.field.value()|default("") }}
Beachten Sie, dass dies
field.value()
eine Methode ist, aber in Django werden Vorlagen()
weggelassen, während in Jinja2 Methodenaufrufe explizit sind.Wenn Sie wissen möchten, welche Version von Django Sie ausführen, erfahren Sie, wann Sie den Befehl runserver ausführen.
Wenn Sie sich vor 1.3 befinden, können Sie wahrscheinlich den im obigen Fehler angegebenen Fix verwenden: https://code.djangoproject.com/ticket/10427#comment:24
quelle
form.field.value
istNone
, der Text "Keine" angezeigt wird. Um stattdessen eine leere Zeichenfolge anzuzeigen, verwenden Sie{{ form.field.value|default_if_none:"" }}
{{ form.initial.fieldname }}
hier (Django 1.2.3).Sie können dies aus der Vorlage heraus mit folgendem tun:
Dadurch wird der Instanzwert angezeigt (wenn das Formular mit einer Instanz erstellt wurde, können Sie stattdessen initial verwenden, wenn Sie möchten) oder die POST-Daten anzeigen, z. B. wenn ein Validierungsfehler auftritt.
quelle
Das scheint zu funktionieren.
quelle
Ich habe eine einfache Lösung für Sie!
Ich habe es versucht und es hat funktioniert. Dazu muss Ihre Ansicht die Formularklasse mit den POST-Daten füllen.
Sehr einfaches Beispiel:
def your_view(request): if request.method == 'POST': form = YourForm(request.POST) if form.is_valid(): # some code here else: form = YourForm() return render_to_response('template.html', {'form':form})
Hoffe das hilft dir. Wenn Sie Fragen haben, lassen Sie es mich bitte wissen.
quelle
{{ form.field_name.value }}
funktioniert bei mirquelle
ModelAdmin
Verwenden Sieadminform.form
für eine Django- Vorlage beispielsweise :{{ adminform.form.field_name.value }}
.Die von Jens vorgeschlagene Lösung ist richtig. Es stellt sich jedoch heraus, dass Django die Daten nicht auffüllt, wenn Sie Ihre ModelForm mit einer Instanz initialisieren (Beispiel unten):
def your_view(request): if request.method == 'POST': form = UserDetailsForm(request.POST) if form.is_valid(): # some code here else: form = UserDetailsForm(instance=request.user)
Also habe ich meine eigene ModelForm-Basisklasse erstellt, die die Anfangsdaten auffüllt:
from django import forms class BaseModelForm(forms.ModelForm): """ Subclass of `forms.ModelForm` that makes sure the initial values are present in the form data, so you don't have to send all old values for the form to actually validate. """ def merge_from_initial(self): filt = lambda v: v not in self.data.keys() for field in filter(filt, getattr(self.Meta, 'fields', ())): self.data[field] = self.initial.get(field, None)
Das einfache Ansichtsbeispiel sieht dann folgendermaßen aus:
def your_view(request): if request.method == 'POST': form = UserDetailsForm(request.POST) if form.is_valid(): # some code here else: form = UserDetailsForm(instance=request.user) form.merge_from_initial()
quelle
Ich habe einige der genannten Möglichkeiten ausprobiert und so mein Problem gelöst:
#forms.py class EditProfileForm(forms.ModelForm): first_name = forms.CharField(label='First Name', widget=forms.TextInput( attrs={'class': 'form-control'}), required=False) last_name = forms.CharField(label='Last Name', widget=forms.TextInput( attrs={'class': 'form-control'}), required=False) # username = forms.CharField(widget=forms.TextInput( # attrs={'class': 'form-control'}), # required=True) address = forms.CharField(max_length=255, widget=forms.TextInput( attrs={'class': 'form-control'}), required=False) phoneNumber = forms.CharField(max_length=11, widget=forms.TextInput( attrs={'class': 'form-control'}), required=False) photo = forms.ImageField(label='Change Profile Image', required=False) class Meta: model = User fields = ['photo', 'first_name', 'last_name', 'phoneNumber', 'address'] # 'username', #views.py def edit_user_profile(request, username): user = request.user username = User.objects.get(username=username) user_extended_photo = UserExtended.objects.get(user=user.id) form = EditProfileForm(request.POST or None, request.FILES, instance=user) user_extended = UserExtended.objects.get(user=user) if request.method == 'POST': if form.is_valid(): # photo = UserExtended(photo=request.FILES['photo'] or None, ) user.first_name = request.POST['first_name'] user.last_name = request.POST['last_name'] user_extended.address = request.POST['address'] user_extended.phoneNumber = request.POST['phoneNumber'] user_extended.photo = form.cleaned_data["photo"] # username = request.POST['username'] user_extended.save() user.save() context = { 'form': form, 'username': username, 'user_extended_photo': user_extended_photo, } return render(request, 'accounts/profile_updated.html', context) else: photo = user_extended.photo first_name = user.first_name last_name = user.last_name address = user_extended.address phoneNumber = user_extended.phoneNumber form = EditProfileForm( initial={'first_name': first_name, 'last_name': last_name, 'address': address, 'phoneNumber': phoneNumber, 'photo': photo}) context = { 'form': form, 'username': username, 'user_extended_photo': user_extended_photo, } return render_to_response('accounts/edit_profile.html', context, context_instance=RequestContext(request)) #edit_profile.html <form action="/accounts/{{ user.username }}/edit_profile/" method="post" enctype='multipart/form-data'> {% csrf_token %} <div class="col-md-6"> <div class="form-group"> {{ form.as_p }} </div> </div> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <button type="submit" value="Update Profile" class="btn btn-info btn-fill pull-right">Update Profile</button> <div class="clearfix"></div> </form>
Ich versuche dies so zu erklären, dass Anfänger es leichter verstehen können. Achten Sie genau auf die
else:
photo = user_extended.photo first_name = user.first_name last_name = user.last_name address = user_extended.address phoneNumber = user_extended.phoneNumber form = EditProfileForm( initial={'first_name': first_name, 'last_name': last_name, 'address': address, 'phoneNumber': phoneNumber, 'photo': photo})
Es ist das, was den Wert zuschreibt, zB:
<p><label for="id_first_name">First Name:</label> <input class="form-control" id="id_first_name" name="first_name" type="text" value="Emmanuel" /></p> <p><label for="id_last_name">Last Name:</label> <input class="form-control" id="id_last_name" name="last_name" type="text" value="Castor" /></p>
quelle
Wenn Sie das Formular mit einer Instanz und nicht mit POST-Daten gefüllt haben (wie in der vorgeschlagenen Antwort erforderlich), können Sie über {{form.instance.my_field_name}} auf die Daten zugreifen.
quelle
Ich wollte den Wert eines Formset-Feldes anzeigen. Ich schloss diese Lösung, die auch für normale Formen funktionieren sollte:
Die oben genannten Lösungen haben bei mir nicht sehr gut funktioniert, und ich bezweifle, dass sie bei vorangestellten Formularen (wie Assistenten und Formularsätzen) funktionieren würden. Die verwendeten Lösungen
{{ form.data.email }}
können nicht funktionieren, da es sich um eine Wörterbuchsuche handelt. Bei vorangestellten Formularen würde Ihr Feldname ungefähr wie "1-E-Mail" (Assistent und vorangestelltes Formular) oder "Formular-1-E-Mail" (Formularsatz) aussehen Das Minuszeichen (-) ist in gepunkteten Vorlagen-Suchausdrücken nicht zulässig.{{form.field_name.value}}
ist nur Django 1.3+.quelle
In Django 1.2 sind {{form.data.field}} und {{form.field.data}} alle in Ordnung, jedoch nicht {{form.field.value}}.
Wie andere sagten, ist {{form.field.value}} nur Django 1.3+, aber es gibt keine Spezifikation in https://docs.djangoproject.com/de/1.3/topics/forms/ . Es kann unter https://docs.djangoproject.com/de/1.4/topics/forms/ gefunden werden .
quelle
quelle