-
-
Save seanmavley/6048b896dd7660694b18 to your computer and use it in GitHub Desktop.
from django import forms | |
from django.contrib.auth.models import User | |
class UserProfileForm(forms.ModelForm): | |
class Meta: | |
model = User | |
fields = ['first_name', 'last_name', 'email'] | |
# models.py | |
from django.db import models | |
from django.contrib.auth.models import User | |
from django.utils.translation import ugettext_lazy as _ | |
from mezzanine.core.fields import FileField | |
from django.db.models.signals import post_save | |
class UserProfile(models.Model): | |
user = models.OneToOneField(User, related_name='user') | |
photo = FileField(verbose_name=_("Profile Picture"), | |
upload_to=upload_to("main.UserProfile.photo", "profiles"), | |
format="Image", max_length=255, null=True, blank=True) | |
website = models.URLField(default='', blank=True) | |
bio = models.TextField(default='', blank=True) | |
phone = models.CharField(max_length=20, blank=True, default='') | |
city = models.CharField(max_length=100, default='', blank=True) | |
country = models.CharField(max_length=100, default='', blank=True) | |
organization = models.CharField(max_length=100, default='', blank=True) | |
def create_profile(sender, **kwargs): | |
user = kwargs["instance"] | |
if kwargs["created"]: | |
user_profile = UserProfile(user=user) | |
user_profile.save() | |
post_save.connect(create_profile, sender=User) | |
# views.py | |
from django.shortcuts import render, HttpResponseRedirect, HttpResponse | |
from django.contrib.auth.decorators import login_required | |
from django.contrib.auth.models import User | |
from .models import UserProfile | |
from .forms import UserProfileForm | |
from django.forms.models import inlineformset_factory | |
from django.core.exceptions import PermissionDenied | |
@login_required | |
def edit_user(request, pk): | |
user = User.objects.get(pk=pk) | |
user_form = UserProfileForm(instance=user) | |
ProfileInlineFormset = inlineformset_factory(User, UserProfile, fields=('website', 'bio', 'phone', 'city', 'country', 'organization')) | |
formset = ProfileInlineFormset(instance=user) | |
if request.user.is_authenticated() and request.user.id == user.id: | |
if request.method == "POST": | |
user_form = UserProfileForm(request.POST, request.FILES, instance=user) | |
formset = ProfileInlineFormset(request.POST, request.FILES, instance=user) | |
if user_form.is_valid(): | |
created_user = user_form.save(commit=False) | |
formset = ProfileInlineFormset(request.POST, request.FILES, instance=created_user) | |
if formset.is_valid(): | |
created_user.save() | |
formset.save() | |
return HttpResponseRedirect('/accounts/profile/') | |
return render(request, "account/account_update.html", { | |
"noodle": pk, | |
"noodle_form": user_form, | |
"formset": formset, | |
}) | |
else: | |
raise PermissionDenied | |
# template.html | |
<div class="col s12 m8 offset-m2"> | |
<div class="card"> | |
<div class="card-content"> | |
<h2 class="flow-text">Update your information</h2> | |
<form action="." method="POST" class="padding"> | |
{% csrf_token %} {{ noodle_form.as_p }} | |
<div class="divider"></div> | |
{{ formset.management_form }} | |
{{ formset.as_p }} | |
<button type="submit" class="btn-floating btn-large waves-light waves-effect"><i class="large material-icons">done</i></button> | |
<a href="#" onclick="window.history.back(); return false;" title="Cancel" class="btn-floating waves-effect waves-light red"><i class="material-icons">history</i></a> | |
</form> | |
</div> | |
</div> | |
</div> |
skpace to do that, in the UserProfile class you need to add following codes
def __str__(self):
return self.user.username
By the way, thanks for solution.
Would I access the edit page by entering the user id in the url? If so I get this error:
File "....\views.py", line 32, in edit_user
if request.user.is_authenticated() and request.user.id == user.id:
TypeError: 'bool' object is not callable
thank you
Also another error is
if request.user.is_authenticated() and request.user.id == user.id:
TypeError: 'bool' object is not callable
Also another error is
if request.user.is_authenticated() and request.user.id == user.id:
TypeError: 'bool' object is not callable
@trnguyen1510 I believe you don't need to use "is_authenticated" as a method call but rather a property, i.e. "request.user.is_authenticated"(NOT "request.user.is_authenticated()")
Best Solution i have found for the Extending User model and Update UserProfile.....But can you provide support to change the admin panel "UserProfile object" into some other attribute like "username"