6๐
The solution proposed by Jens is correct.
However, it turns out that if you initialize your ModelForm with an instance (example below) django will not populate the data:
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)
So, I made my own ModelForm base class that populates the initial data:
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)
Then, the simple view example looks like this:
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()
147๐
This was a feature request that got fixed in Django 1.3.
Hereโs the bug: https://code.djangoproject.com/ticket/10427
Basically, if youโre running something after 1.3, in Django templates you can do:
{{ form.field.value|default_if_none:"" }}
Or in Jinja2:
{{ form.field.value()|default("") }}
Note that field.value()
is a method, but in Django templates ()
โs are omitted, while in Jinja2 method calls are explicit.
If you want to know what version of Django youโre running, it will tell you when you do the runserver command.
If you are on something prior to 1.3, you can probably use the fix posted in the above bug: https://code.djangoproject.com/ticket/10427#comment:24
- [Django]-Generating file to download with Django
- [Django]-Location of Django logs and errors
- [Django]-Why does DEBUG=False setting make my django Static Files Access fail?
50๐
You can do this from the template with something like this:
{% if form.instance.some_field %}
{{form.instance.some_field}}
{% else %}
{{form.data.some_field}}
{% endif %}
This will display the instance value (if the form is created with an instance, you can use initial instead if you like), or else display the POST data such as when a validation error occurs.
- [Django]-Django Rest Framework File Upload
- [Django]-Differences between STATICFILES_DIR, STATIC_ROOT and MEDIA_ROOT
- [Django]-Handling race condition in model.save()
19๐
I have a simple solution for you!
{{ form.data.email }}
I tried this and it worked. This requires your view to populate the form class with the POST data.
Very simple example:
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})
Hope that helps you. If you have any questions please let me know.
- [Django]-Celery discover tasks in files with other filenames
- [Django]-How to debug in Django, the good way?
- [Django]-Django filter queryset __in for *every* item in list
- [Django]-React Error: Target Container is not a DOM Element
- [Django]-Folder Structure for Python Django-REST-framework and Angularjs
- [Django]-How can I filter a date of a DateTimeField in Django?
- [Django]-ImportError: No module named 'django.core.urlresolvers'
- [Django]-Copy a database column into another in Django
- [Django]-Redirect to Next after login in Django
3๐
I wanted to display the value of a formset field. I concluded this solution, which should work for normal forms too:
{% if form.email.data %} {{ form.email.data }}
{% else %} {{ form.initial.email }}
{% endif %}
The above solutions didnโt worked very well for me, and I doubt they would work in case of prefixed forms (such as wizards and formsets).
The solutions using {{ form.data.email }}
canโt work, because it is a dictionary lookup, and with prefixed forms your field name would look something like โ1-emailโ (wizard and prefixed form) or โform-1-emailโ (formset), and the minus sign (-) are not allowed in dotted template lookup expressions.
{{form.field_name.value}}
is Django 1.3+ only.
- [Django]-Django DoesNotExist
- [Django]-Folder Structure for Python Django-REST-framework and Angularjs
- [Django]-Update to Django 1.8 โ AttributeError: django.test.TestCase has no attribute 'cls_atomics'
3๐
I tried a few of the mentioned possibilities, and this is how I solved my 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 }}
</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>
I am trying to explain this in a way so that beginners may find it easier to understand. Pay close attention to the 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})
It is what gets the value attrib, e.g.:
<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>
- [Django]-Automatic creation date for Django model form objects
- [Django]-How to solve "Page not found (404)" error in Django?
- [Django]-Handling race condition in model.save()
2๐
If youโve populated the form with an instance and not with POST data (as the suggested answer requires), you can access the data using {{ form.instance.my_field_name }}.
- [Django]-Python NameError: name 'include' is not defined
- [Django]-"<Message: title>" needs to have a value for field "id" before this many-to-many relationship can be used.
- [Django]-How to rename items in values() in Django?
1๐
For check box with its items:
{% for item in people.q %}
<div class="form-check form-switch ">
<label class="form-check-label" for="{{ item.id_for_label }}">{{ item.data.label }}</label>
<input class="form-check-input" type="checkbox" id="{{ item.id_for_label }}" value="{{ item.data.value }}">
</div>
{% endfor %}
q is field name.
- [Django]-Class Based Views VS Function Based Views
- [Django]-How to use pdb.set_trace() in a Django unittest?
- [Django]-Django 1.3.1 compilemessages. Error: sh: msgfmt: command not found
0๐
On Django 1.2, {{ form.data.field }} and {{ form.field.data }} are all OK, but not {{ form.field.value }}.
As others said, {{ form.field.value }} is Django 1.3+ only, but thereโs no specification in https://docs.djangoproject.com/en/1.3/topics/forms/. It can be found in https://docs.djangoproject.com/en/1.4/topics/forms/.
- [Django]-How to get the current language in Django?
- [Django]-Django โ view sql query without publishing migrations
- [Django]-How do I do an OR filter in a Django query?
- [Django]-ImportError: Failed to import test module:
- [Django]-CSV new-line character seen in unquoted field error
- [Django]-Creating a dynamic choice field