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 после создания суперпользователя, существующие суперпользователи могут не иметь связанного с ними профиля.

Вернуться на верх