Как заполнить поле из представления django? Сбой ограничения UNIQUE: auth_user.username

Я пытаюсь заполнить поле на шаблонной форме в Django. Я пытался сделать это как в представлении, так и в значении на шаблоне формы, но безуспешно. Вот моя работа

В результате мы должны заполнить поле имени пользователя и email из модели ресурса, но я получаю ошибку UNIQUE constraint failed: auth_user.username error.

Спасибо

forms.py

class AdminRegistrationForm(UserCreationForm):
    is_superuser = forms.BooleanField(),
    password1 = forms.CharField(
        label="Password",
        widget=forms.PasswordInput)
    password2 = forms.CharField(
        label="Password Confirmation",
        widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['password1',  'password2']

    def clean_password2(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')

        if not password1 or not password2:
            raise ValidationError("Please confirm your password")

        if password1 != password2:
            raise ValidationError("Passwords must match")

        return password2

view.py

def admin_registration(request, username):
    resources = Resource.objects.get(username=username)

    if request.user.is_authenticated:
        return redirect(reverse('index'))

    if request.method == "POST":
        resources = Resource.objects.get(username=username)
        admin_registration_form = AdminRegistrationForm(request.POST)

        if admin_registration_form.is_valid():
            obj = admin_registration_form.save(commit=False)
            obj.is_superuser = True
            obj.save()

            user = auth.authenticate(username=[resources.username],
                                     password=request.POST['password1'])
            if user:
                auth.login(user=user, request=request)
                messages.success(request, "You have successfully registered")
                return redirect(reverse('index'))
            else:
                messages.error(request, "Unable to register your account at this time")
    else:
        admin_registration_form = AdminRegistrationForm()
    return render(request, 'registration/registration.html', {
        "registration_form": admin_registration_form, 'email': resources.email })

models.py

class Resource(models.Model):
    ROLE = [
        ('Analyst', "Analyst"),
        ('Team Manager', "Team Manager"),
        ('Quality Auditor', "Quality Auditor"),
        ('Senior Analyst', "Senior Analyst"),
        ('', "")
    ]
    username = models.CharField(max_length=254, default='')
    status = models.IntegerField(default=1)
    email = models.EmailField(max_length=254, null=False, default='')
    email_sent = models.IntegerField(default=0)
    name = models.CharField(max_length=254, default='')
    surname = models.CharField(max_length=254, default='')
    role = models.CharField(max_length=30, choices=ROLE, default='')
    start_date = models.DateField()
    end_date = models.DateField(null=True)

    USERNAME_FIELD = "eid"

    def __str__(self):
        return self.email

В комментарии вы сказали, что используете общие User, которые предоставляет Django. Тогда ваша ошибка в том, что вы не указали поле username в вашей форме. Это поле необходимо, если вы не указали другие USERNAME_FIELD, кроме как в модели User. А вы этого не сделали, потому что просто импортировали ее. В таком случае каждая User, созданная с помощью AdminRegistrationForm, не имеет username, или на самом деле имеет - None. Так что пока первый User может быть создан, второй будет иметь тот же (None) username, и он не будет уникальным.

Чтобы решить эту проблему, просто добавьте поле username. Пример:

class AdminRegistrationForm(UserCreationForm):
    username = forms.CharField('username', max_length=150)
    ...

PS. USERNAME_FIELD = "eid" ничего не делает, потому что Resource не является User моделью. Просто создайте свою собственную CustomUser модель, которая настоятельно рекомендуется самим Django :)

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