Ошибка целостности Django от Abstractbaseuser

IntegrityError at /
UNIQUE constraint failed: pages_profile.username
Request Method: POST
Request URL:    http://127.0.0.1:8000/
Django Version: 3.2.9
Exception Type: IntegrityError
Exception Value:    
UNIQUE constraint failed: pages_profile.username

Как обновить пользовательское поле аватара абстрактного пользователя? А именно obj = Profile.objects.create(avatar = img)

from django.shortcuts import redirect, render
from .forms import UserProfileForm
from .models import Profile

def index(request):
    context = {}
    if request.method == "POST":
        form = UserProfileForm(request.POST, request.FILES)
        if form.is_valid():
            img = form.cleaned_data.get("avatar")
            obj = Profile.objects.create(
                                 avatar = img
                                 )
            obj.save()
            print(obj)
            return redirect(request, "home.html", obj)

    else:
        form = UserProfileForm()
    context['form']= form
    return render(request, "home.html", context)

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class Profile(AbstractUser):
    
    """ bio = models.TextField(max_length=500, blank=True)
    phone_number = models.CharField(max_length=12, blank=True)
    birth_date = models.DateField(null=True, blank=True) """
    avatar = models.ImageField(default='default.png', upload_to='', null=True, blank=True)

forms.py

from django import forms
from django.core.files.images import get_image_dimensions

from pages.models import Profile

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('avatar',)

    def clean_avatar(self):
        avatar = self.cleaned_data['avatar']

        try:
            w, h = get_image_dimensions(avatar)

            #validate dimensions
            max_width = max_height = 1000
            if w > max_width or h > max_height:
                raise forms.ValidationError(
                    u'Please use an image that is '
                     '%s x %s pixels or smaller.' % (max_width, max_height))

            #validate content type
            main, sub = avatar.content_type.split('/')
            if not (main == 'image' and sub in ['jpeg', 'pjpeg', 'gif', 'png']):
                raise forms.ValidationError(u'Please use a JPEG, '
                    'GIF or PNG image.')

            #validate file size
            if len(avatar) > (20 * 1024):
                raise forms.ValidationError(
                    u'Avatar file size may not exceed 20k.')

        except AttributeError:
            """
            Handles case when we are updating the user profile
            and do not supply a new avatar
            """
            pass

        return avatar

Ошибка

IntegrityError at /
UNIQUE constraint failed: pages_profile.username

подразумевает, что уже существует другой объект профиля с тем же именем пользователя, который вы пытаетесь создать.

Чтобы исправить это, необходимо обновить существующий профиль, если он уже существует.

Вы можете использовать django create_or_update так

obj, created = Profile.objects.update_or_create(
    username=form.cleaned_data.get('username'),
    defaults={'avatar': img},
)

это заставит django обновить любой существующий объект Profile с username=form.cleaned_data.get('username')

если такого объекта профиля не существует, то он будет создан.

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