唯一约束失败:“ app” _customuser.username

时间:2018-11-19 21:09:19

标签: python django django-models django-forms

我是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)

0 个答案:

没有答案