Search code examples
pythondjangodjango-users

Updating user in django


In my application, I used email and password for user authentication, which works fine. However, I want to offer the user the option of adding other information to their account like first names, last names, and dates of birth.

I have a change form in myapp.forms.py

class MyChangeForm(forms.ModelForm):
    """
    Form for editing an account.
    """

    first_name = forms.CharField(widget=forms.TextInput, label="First name")
    last_name = forms.CharField(widget=forms.TextInput, label="Last name")
    date_of_birth = forms.DateField(widget=forms.DateField, label="Date of birth")

    class Meta:
        model = MyUser
        fields = ['first_name', 'last_name', 'date_of_birth']

    def save(self, commit=True):
        user = super(MyChangeForm, self).save(commit=False)
        if commit:
            user.save()
        return user

in my views.py, I have the following method for updating

@login_required(login_url='/')
def update_user(request):
    if request.method == 'POST':
        form = MyChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            user = form.save(commit=False)
            user.save()
            return HttpResponseRedirect('/')
    else:
        form = MyChangeForm(instance=request.user)
    return render_to_response('update_user.html', context_instance=RequestContext(request))

and my update_user.html is as follows

{% extends 'user_base.html' %}

{% block content %}

 <div class="col-sm-3 col-sm-offset-5"> 
   <h1> Update User</h1>
     <form method='POST' action='/update_user/'> {% csrf_token %}
       <ul>
         {{ form.as_table }}
       </ul>
       <input type='Submit' class='btn btn-primary btn-block'>
     </form>
 </div> 

{% endblock %} 

However, when I serve the file I see this:

My update user page

As seen here, there's no way to enter my fields!

How can I fix this? It's probably easy, but I'm getting tunnel vision.

erip


Solution

  • Add form to the context, for example like this:

    render('update_user.html', {'form': form})