Jak wyświetlić wartość pola formularza Django w szablonie?


Mam formularz z właściwością e-mail.
Używając
{{form.email}}
w przypadku błędu walidacji, Django nadal wyświetla poprzednią wartość w atrybucie value tagu wejściowego:
<input type="text" id="id_email" maxlength="75" class="required"
value="some@email.com" name="email">

Chcę samodzielnie renderować tag wejściowy (aby dodać kod JavaScript i klasę błędu w przypadku błędu). Na przykład to jest mój szablon zamiast
{{form.email}}
:
<input type="text" autocomplete="on" id="id_email" name="email"
class="email {% if form.email.errors %} error {% endif %}">

Jednak to nie pokazuje użytkownikowi niewłaściwej wartości (w tym przykładzie
some@email.com
).
Jak uzyskać wartość pola w szablonie?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To była prośba o funkcję, która została naprawiona w Django 1.3.
Oto błąd:

https://code.djangoproject.com/ticket/10427
https://code.djangoproject.com/ticket/10427
Zasadniczo, jeśli uruchamiasz coś po 1.3, to w szablonach Django możesz to zrobić:
{{ form.field.value|default_if_none:"" }}

Lub w Jinja2:
{{ form.field.value()|default("") }}

Zauważ, że
field.value ()
jest metodą, ale w szablonach Django pomija się
()
, podczas gdy w Jinja2 wywołania metod są jawne.
Jeśli chcesz wiedzieć, której wersji Django używasz, powie ci, kiedy uruchomisz polecenie runningerver.
Jeśli korzystasz z czegokolwiek wcześniejszego niż 1.3, prawdopodobnie możesz użyć poprawki opublikowanej w powyższym błędzie:

https://code.djangoproject.com ... nt:24
https://code.djangoproject.com ... nt:24
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz to zrobić z szablonu za pomocą czegoś takiego:
{% if form.instance.some_field %}
{{form.instance.some_field}}
{% else %}
{{form.data.some_field}}
{% endif %}

Spowoduje to wyświetlenie wartości instancji (jeśli formularz jest utworzony za pomocą instancji, możesz zamiast tego użyć początkowego, jeśli chcesz) lub wyświetlić dane POST, na przykład gdy wystąpi błąd walidacji.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wydaje się, że działa.
{{ form.fields.email.initial }}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Mam dla Ciebie proste rozwiązanie!
{{ form.data.email }}

Spróbowałem tego i zadziałało. Wymaga to od widoku wypełnienia klasy formularza danymi POST.
Bardzo prosty przykład:
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})

Mam nadzieję, że to ci pomoże. Jeśli masz jakieś pytania, daj mi znać.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

{{form.field_name.value}}
mi pasuje
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Rozwiązanie zaproponowane przez Jensa jest poprawne.
Okazuje się jednak, że jeśli zainicjujesz ModelForm z

Instancja

(przykład poniżej) to django nie wypełni danych:
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)

Dlatego utworzyłem własną podstawową klasę ModelForm, która wypełnia surowe dane:
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)

Wtedy prosty przykład widoku wygląda następująco:
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()
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wypróbowałem kilka z wymienionych możliwości i tak rozwiązałem mój problem:
#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 }}



<button type="submit" value="Update Profile" class="btn btn-info btn-fill pull-right">Update Profile</button>
<div class="clearfix">
</form>

Staram się to wyjaśnić w sposób, który ułatwi zrozumienie dla początkujących. Zwróć szczególną uwagę na
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})

Oto, co otrzymuje wartość atrybutu, na przykład:
<label for="id_first_name">First Name:</label> <input class="form-control" id="id_first_name" name="first_name" type="text" value="Emmanuel"/><label for="id_last_name">Last Name:</label> <input class="form-control" id="id_last_name" name="last_name" type="text" value="Castor"/>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli wypełniłeś formularz za pomocą instancji, a nie danych POST (zgodnie z sugerowaną odpowiedzią), możesz uzyskać dostęp do danych za pomocą {{form.instance.my_field_name}}.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Chciałem wyświetlić wartość pola zestawu formularzy. Doszedłem do wniosku, że to rozwiązanie powinno działać również dla normalnych form:
{% if form.email.data %} {{ form.email.data }}
{% else %} {{ form.initial.email }}
{% endif %}

Powyższe rozwiązania nie sprawdziły się u mnie zbyt dobrze i wątpię, czy sprawdzą się w przypadku formularzy z prefiksami (jak kreatory i zestawy formularzy).
Rozwiązania korzystające z
{{form.data.email}}
mogą nie działać, ponieważ jest to wyszukiwanie w słowniku, a w przypadku formularzy z prefiksami nazwa pola będzie wyglądać jak „1-e-mail” (kreator i formularz przedrostka) lub „form-1-email” (zestaw form), a znak minus (-) nie jest dozwolony w wyrażeniach wyszukiwania wzorca kropkowego.
{{form.field_name.value}}
to tylko Django 1.3+.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W Django 1.2 {{form.data.field}} i {{form.field.data}} są w porządku, ale nie {{form.field.value}}.

Jak powiedzieli inni, {{form.field.value}} to tylko Django 1.3+, ale w

https://docs.djangoproject.com ... orms/
https://docs.djangoproject.com ... orms/
brak specyfikacji. Można go znaleźć w

https://docs.djangoproject.com ... orms/
https://docs.djangoproject.com ... orms/
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

{{form.fields.email}}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się