How to Edit User Profile Both Django User and Custom User Fields
Posted By : Amit Patel | 31-Dec-2018
Quick Summary:-
In this blog, we will learn how to edit User profile both Django User and custom User fields. And the custom User model is UserProfile.
Prerequisites:-
- I have used python version 3.6
- Django version 2.0.2
- Operating System Ubuntu 16.04
- MySQL
- IDE -
pycharm -community-2018.2.5
Let's start to create Django project:-
# This command will create a Django project with demopythonproject name.
$ django-admin.py startprojectdemopythonproject
# View the list of files or folders.
$ ls
# Select dictory/folder.
$ cd demopythonproject
Now, create accounts app:-
# In Django, we create app module "accounts" using this command.
$ python3.6 manage.py startapp accounts
And run the project-
# Using this command, we will start the project.
$ python3.6 manage.py runserver
If we navigate this Url http://127.0.0.1:8000. We'll see Django welcome page.
Add "accounts" at the bottom of "INSTALLED_APPS". And add the "AUTH_PROFILE_MODULE" config at the bottom of the entire file.
We will add "accounts" app in settings.py and use the "AUTH_USER_MODEL" config to tell Django to use our another model. And our another model will UserProfile.
## demopythonproject/settings.py
INSTALLED_APPS = [
......
......
......
......
'accounts',
]
......
......
......
AUTH_PROFILE_MODULE = "accounts.UserProfile"
Update database configuration in settings.py-
## demopythonproject/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'custom',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
}
}
where 'custom' is database name. And we will create 'custom' database through terminal.
In
UserProfile model, that means it is a entity class. And created "accounts_userprofile" table in "custom" database. Where all entry of UserProfile will be store.
## accounts/modles.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
# Create your models here.
class UserProfileManager(models.Manager):
pass
class UserProfile(models.Model):
#user = models.OneToOneField(User)
user = models.OneToOneField(User, on_delete=models.CASCADE)
description = models.CharField(max_length=100, default='')
city = models.CharField(max_length=100, default='')
website = models.URLField(default='')
phoneNumber = models.IntegerField(default=0)
image = models.ImageField(upload_to='profile_image' , blank=True)
def __str__(self):
return self.user.username
def createProfile(sender, **kwargs):
if kwargs['created']:
user_profile = UserProfile.objects.created(user=kwargs['instance'])
post_save.connect(createProfile, sender=User)
Django form is a nice thing that we can create a ModelForm which will save the result of the form to the model exactly what we want to do.
## accounts/forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.forms import ModelForm
from accounts.models import UserProfile
class EditProfileForm(ModelForm):
class Meta:
model = User
fields = (
'email',
'first_name',
'last_name'
)
class ProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ('city', 'description', 'phoneNumber', 'website', 'image') #Note that we didn't mention user field here.
In views.py:-
In views.py, we can write our custom view for our HTML templates and will use the ORM to get the data from the database.
## accounts/views.py
from django.shortcuts import render, redirect
from datetime import datetime
from accounts.forms import (EditProfileForm, ProfileForm)
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required
@login_required
def edit_profile(request):
if request.method == 'POST':
form = EditProfileForm(request.POST, instance=request.user)
profile_form = ProfileForm(request.POST, request.FILES, instance=request.user.userprofile) # request.FILES is show the selected image or file
if form.is_valid() and profile_form.is_valid():
user_form = form.save()
custom_form = profile_form.save(False)
custom_form.user = user_form
custom_form.save()
return redirect('accounts:view_profile')
else:
form = EditProfileForm(instance=request.user)
profile_form = ProfileForm(instance=request.user.userprofile)
args = {}
# args.update(csrf(request))
args['form'] = form
args['profile_form'] = profile_form
return render(request, 'accounts/edit_profile.html', args)
In
## accounts/urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns('accounts.views',
url(r'^view_profile/$', 'view_profile', name ='view_profile'),
url(r'^view_profile/edit_profile/$', 'edit_profile', name ='edit_profile')
In the
## accounts/templates/base.html
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
{% block head %}
<title>Base</title>
{% endblock %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
{% if user.is_authenticated %}
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#"><strong>Oodles</strong></a>
</div>
<ul class="nav navbar-nav">
<li><a href="{% url 'home:home' %}">Home</a></li>
<li><a href="{% url 'accounts:view_profile'%}">Profile</a></li>
<li><a href="{% url 'blog:blog' %}">Blog</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="{% url 'accounts:view_profile'%}"><span class="glyphicon glyphicon-user"></span>Hello {{ user }} !!</a></li>
<li><img src="{{ user.userprofile.image.url}}" width="50" height="50"></li>
<li><a href="{% url 'accounts:logout' %}"><span class="glyphicon glyphicon-log-out"></span> Logout</a></li>
</ul>
</div>
</nav>
{%else%}
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#"><strong>Oodless</strong></a>
</div>
<ul class="nav navbar-nav">
<li class="active"><a href="{%url 'home:home'%}">Home</a></li>
<li><a href="#">Profile</a></li>
<li><a href="#">Contact</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="{% url 'accounts:register' %}"><span class="glyphicon glyphicon-user"></span> Sign Up</a></li>
<li><a href="{% url 'accounts:login' %}"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
</ul>
</div>
</nav>
</nav>
</div>
{% endif %}
{% block body %}
<h1>Base</h1>
{% endblock %}
</body>
</html>
In templates folder make another accounts folder.
Now we create edit_profile.html and view_profile.html file in accounts folder.
## accounts/templates/accounts/edit_profile.html
{% extends 'base.html' %}
{% block head %}
<title>Profile</title>
{% endblock %}
{% block body %}
<div class="container">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form.as_table }}
{{ profile_form.as_table }}
</table>
<button type="submit">Submit</button>
</form>
<br>
</div>
{% endblock %}
## accounts/templates/accounts/view_profile.html
{% extends 'base.html' %}
{%endblock%}
{%block body%}
Profile
In
## demopythonproject/urls.py
from django.conf.urls import include, url
from django.contrib import admin
from demopythonproject import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^accounts/', include('accounts.urls', namespace='accounts')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Now we can run make migrations and migrate commands to create a new database that uses the custom user model.
$ python3.6 manage.py makemigrations accounts
$ python3.6 manage.py migrate
Conclusion:-
In this article, we have covered how to edit User profile both Django User and custom User fields.
Reference:-
External links to the source code-
1)- https://www.youtube.com/watch?v=Fc2O3_2kax8&list=PLw02n0FEB3E3VSHjyYMcFadtQORvl1Ssj
Cookies are important to the proper functioning of a site. To improve your experience, we use cookies to remember log-in details and provide secure log-in, collect statistics to optimize site functionality, and deliver content tailored to your interests. Click Agree and Proceed to accept cookies and go directly to the site or click on View Cookie Settings to see detailed descriptions of the types of cookies and choose whether to accept certain cookies while on the site.
About Author
Amit Patel
Amit Patel is having good knowledge of java,have expertise in hibernate.