Почему я получаю IntegrityError (1062, «Дублирующаяся запись» для ключа «username»)? - PullRequest
0 голосов
/ 14 февраля 2020

Я получаю следующую ошибку (1062, «Дублирующая запись» для ключа «имя пользователя»), хотя я вообще не предоставил поле имени пользователя.

Я пытаюсь сохранить обновленную информацию о пользователе в существующей таблице учетной записи.

Не могли бы вы помочь мне разобраться в проблеме? Ниже приведены подробности и фрагменты кода. Спасибо за ваше время заранее.

Ошибка:

Request URL:    http://127.0.0.1:8000/profile/profileUpdate/
Django Version: 3.0.2
Exception Type: IntegrityError
Exception Value:    
(1062, "Duplicate entry '' for key 'username'")
Exception Location: C:\Users\hp\Envs\test\lib\site-packages\MySQLdb\connections.py in query, line 239
Python Executable:  C:\Users\hp\Envs\test\Scripts\python.exe
Python Version: 3.7.3

froms.py:

class ProfileUpdateForm(forms.ModelForm):

    class Meta:
        model = Account 
        fields = ('image', 'phone', 'guardianPhone', 'parrentPhone', 'emergencyPhone', 'address1', 'address2')

models.py:

class Account(AbstractBaseUser):
    username     = models.CharField(max_length = 50, unique= True)
    email        = models.EmailField(verbose_name = "email", max_length = 50, unique=True)
    image        = models.ImageField(upload_to = "pics/", default = "user/noimg")
    dateTime_joined  = models.DateTimeField(verbose_name="date joined", auto_now_add = True)
    is_admin     = models.BooleanField(default=False)
    is_staff     = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active    = models.BooleanField(default=True)

    first_login  =  models.BooleanField(default=True)
    room         = models.CharField(max_length = 10 , default = "unAssigned")
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
    phone        = models.CharField(validators=[phone_regex], max_length=17, blank=True) # validators should be a list
    #phone        = PhoneNumberField(null=False, unique = True)
    guardianPhone= models.CharField(validators=[phone_regex], max_length=17, blank=True)
    parrentPhone = models.CharField(validators=[phone_regex], max_length=17, blank=True)
    emergencyPhone= models.CharField(validators=[phone_regex], max_length=17, blank=True)

    address1 = models.CharField(max_length = 200, blank=True)
    address2 = models.CharField(max_length = 200, blank=True)

views.py:

def profileUpdate(request):
    context = {}
    if request.POST:
        form = ProfileUpdateForm(request.POST)
        if form.is_valid():
            form.save()
            user = request.user

            return redirect('../../dashboard/')
        else: 
            context['profile_form'] = form
    else:
        form = ProfileUpdateForm()
        context['profile_form'] = form
    return render(request, 'profileUpdate.html', context)

1 Ответ

1 голос
/ 14 февраля 2020

Это происходит потому, что вы установили ограничение unique в поле username:

models.CharField(max_length = 50, unique= True)

Ошибка говорит о том, что у вас уже есть запись в БД с именем пользователя нулевой длины. Вы должны или предоставить действительно уникальное имя в своей логике c или создать уникальное имя по умолчанию, добавив аргумент по умолчанию в это поле:

models.CharField(max_length = 50, unique= True, default=some_callable)

, где callable - это метод, который по умолчанию предоставляет уникальные имена, если не был предоставлен при создании объекта с формой. Это может вызываться при генерации случайных имен.

Другой вариант - использовать сигнал pre_save с настройкой имени пользователя по умолчанию, например, user.username = f'user_{hash_of_something}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...