Как заполнить поле из представления 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 :)