RelatedObjectDoesNotExist в /account/edit/ У пользователя нет профиля
Я могу редактировать других пользователей без статуса администратора без проблем, но это сообщение об ошибке RelatedObjectDoesNotExist at /account/edit/ User has no profile
, когда я пытаюсь редактировать суперпользователя. Я создал этого суперпользователя ПОСЛЕ того, как добавил класс модуля Profile с его атрибутами, и сделал миграции. Провел несколько часов, пытаясь разобраться, но так и не смог. Спасибо за любую помощь
Models.py
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
class Profile(models.Model):
print(f'------->{settings.AUTH_USER_MODEL}')
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
date_of_birth = models.DateField(blank=True, null=True, default=None)
photo = models.ImageField(blank=True, upload_to="users/%Y/%m/%d/")
def __str__(self):
return f'Profile of {self.user.username}'
Views.py
from account.models import Profile
@login_required
def Edit(request):
if request.method == "POST":
user_form = UserEditForm(instance= request.user, data=request.POST)
profile_form = ProfileEditForm(instance= request.user.profile,data=request.POST, files=request.FILES)
if user_form.is_valid():
user_form.save()
profile_form.save()
return render(request,'account/dashboard.html')
else:
user_form = UserEditForm(instance= request.user)
profile_form = ProfileEditForm(instance= request.user.profile)
return render(request, "account/edit.html",{'user_form':user_form})
forms.py
class UserEditForm(forms.ModelForm):
class Meta:
model = User
fields = ['first_name', 'last_name','email']
def clean_email(self):
data = self.cleaned_data['email']
qs = User.objects.exclude(id=self.instance.id).filter(email=data)
if qs.exists():
raise forms.ValidationError('email already in use')
else:
return data
class ProfileEditForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['date_of_birth','photo']
edit.html
{% extends "base.html" %}
{% block content %}
<html>
<p>Please enter correct information bellow to edit</p>
<form method="POST" enctype="multipart/form-data">
{{user_form.as_p}}
{{profile_form.as_p}}
{% csrf_token %}
<input type="submit" value="save changes" />
</form>
</html>
{% endblock %}
admin.py
from django.contrib import admin
from .models import Profile
# Register your models here.
@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
list_display = ['user','date_of_birth', 'photo']
raw_id_fields = ['user']
Вы можете справиться с этим, создав объект профиля для суперпользователя, если он еще не существует, используя get_or_create()
так:
from django.contrib.auth.models import User
from account.models import Profile
@login_required
def Edit(request):
profile, created = Profile.objects.get_or_create(user=request.user)
if request.method == "POST":
user_form = UserEditForm(instance=request.user, data=request.POST)
profile_form = ProfileEditForm(instance=profile, data=request.POST, files=request.FILES)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
return render(request, 'account/dashboard.html')
else:
user_form = UserEditForm(instance=request.user)
profile_form = ProfileEditForm(instance=profile)
return render(request, "account/edit.html", {'user_form': user_form, 'profile_form': profile_form})
Вам необходимо убедиться, что каждый пользователь, включая суперпользователей, имеет соответствующий объект Profile
. Поскольку вы добавили модель Profile
после создания суперпользователя, существующие суперпользователи могут не иметь связанного с ними профиля.