我是Django的新手。我用“ createsuperuser”注册了一个超级用户,现在我想用我的自定义注册表单创建一个普通用户,但这会向我发送有关唯一约束的错误:
/ registro / registrar /
中的IntegrityError唯一约束失败:registroUsuario_customuser.username
请求方法:POST 要求网址:http://127.0.0.1:8000/registro/registrar/ Django版本:2.0.9 异常类型:IntegrityError 异常值:
唯一约束失败:registroUsuario_customuser.username
异常位置:执行行第303行的C:\ Users \ riria \ Desktop \ perrosUnidad3 \ myvenv \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ base.py Python可执行文件:C:\ Users \ riria \ Desktop \ perrosUnidad3 \ myvenv \ Scripts \ python.exe 的Python版本:3.7.0 Python路径:
['C:\ Users \ riria \ Desktop \ perrosUnidad3', 'C:\ Users \ riria \ Desktop \ perrosUnidad3 \ myvenv \ Scripts \ python37.zip', 'C:\ Users \ riria \ AppData \ Local \ Programs \ Python \ Python37 \ DLLs', 'C:\ Users \ riria \ AppData \ Local \ Programs \ Python \ Python37 \ lib', 'C:\ Users \ riria \ AppData \ Local \ Programs \ Python \ Python37', 'C:\ Users \ riria \ Desktop \ perrosUnidad3 \ myvenv', 'C:\ Users \ riria \ Desktop \ perrosUnidad3 \ myvenv \ lib \ site-packages']
服务器时间:伦,2018年11月19日17:56:33 -0300
这是我的代码:
models.py
class CustomUserManager(UserManager):
def create_user(self, run, email, fechaNac, nombre, apellido, telefono, regiones, comunas, tipo_vivienda, password=None):
if not run:
raise ValueError("Usuario debe ingresar su run")
user = self.model(
run = run,
email = self.normalize_email(email),
fechaNac = fechaNac,
nombre = nombre,
apellido = apellido,
telefono = telefono,
regiones = regiones,
comunas = comunas,
tipo_vivienda = tipo_vivienda,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, run, email, fechaNac, nombre, apellido, telefono, regiones, comunas, tipo_vivienda, password):
user = self.create_user(
run = run,
password=password,
email=email,
fechaNac=fechaNac,
nombre=nombre,
apellido=apellido,
telefono=telefono,
regiones = regiones,
comunas = comunas,
tipo_vivienda = tipo_vivienda,
)
user.is_admin = True
user.save(using=self._db)
return user
class CustomUser(AbstractUser):
run = models.CharField(max_length=9, unique=True, primary_key=True)
email = models.EmailField(max_length=30, unique=True, verbose_name='Direccion de correo') #obtener email con get_email_field_name()
fechaNac = models.DateField(verbose_name="Fecha de Nacimiento")
nombre = models.CharField(max_length=15, unique=False) #get_full_name()???
apellido = models.CharField(max_length=15)
telefono = models.CharField(max_length=9)
regiones = models.CharField(max_length=40)
comunas = models.CharField(max_length=40)
tipo_viviendas = ((1,'Casa con patio grande'),(2,'Casa con patio pequeño'),(3,'Casa sin patio'),(4,'Departamento'))
tipo_vivienda = models.IntegerField(choices=tipo_viviendas)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=True)
USERNAME_FIELD = 'run'
REQUIRED_FIELDS = ['email','fechaNac','nombre','apellido','telefono','regiones','comunas','tipo_vivienda']
ACCOUNT_USER_MODEL_USERNAME_FIELD = 'run'
objects = CustomUserManager()
def __str__(self):
return self.run
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, misPerris):
return True
@property
def is_staff(self):
return self.is_admin
forms.py
class UserCreationForm(forms.ModelForm):
#crear new users incluyendo todos los campos requeridos
password1 = forms.CharField(label='contrasena', widget=forms.PasswordInput)
password2 = forms.CharField(label='Confirmar contrasena', widget=forms.PasswordInput)
class Meta:
model = CustomUser
fields = ('run','email','fechaNac','nombre','apellido','telefono','regiones','comunas','tipo_vivienda')
def clean_password2(self):
#para ver que las 2 passwords sean iguales
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Las Contrasenas no son iguales")
return password2
def save(self, commit=True):
#guardar la contrasena en hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
class UserChangeForm(forms.ModelForm):
#este es para actualizar al usuario y todos sus campos excepto la password creo
password = ReadOnlyPasswordHashField
class Meta:
model = CustomUser
fields = ('run','password','email','fechaNac','nombre','apellido','telefono','regiones','comunas','tipo_vivienda','is_active','is_admin')
def clean_password(self):
#
return self.initial["password"]
class UserAdmin(BaseUserAdmin):
#el form para agregar y cambia instancias de usuario
form = UserChangeForm
add_form = UserCreationForm
#campos que apareceran en admin en el User Model
list_display = ('run','email','fechaNac','nombre','apellido','telefono','regiones','comunas','tipo_vivienda','is_admin')
list_filter = ('is_admin',)
fieldsets = (
(None, {'fields': ('run','password')}),
('Personal info', {'fields': ('email','fechaNac','nombre','apellido','telefono','regiones','comunas','tipo_vivienda',)}),
('Permissions', {'fields': ('is_admin',)}),
)
# add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
# overrides get_fieldsets to use this attribute when creating a user.
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('run','email','fechaNac','nombre','apellido','telefono','regiones','comunas','tipo_vivienda','password1','password2')}
),
)
search_fields = ('run',)
ordering = ('run',)
filter_horizontal = ()
views.py
def registrar(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect(login_redirect)
else:
form = UserCreationForm()
args = {'form': form}
return render(request, 'registro/registro.html', args)