Сбой УНИКАЛЬНОГО ограничения: "app" _customuser.username - PullRequest
0 голосов
/ 20 ноября 2018

Я новичок в Джанго.Я зарегистрировал суперпользователя с помощью «createuperuser», и теперь я хочу создать обычного пользователя с моей пользовательской регистрационной формой, но это выдает мне эту ошибку об уникальном ограничении:

IntegrityError в / registro / registrar /

Не удалось выполнить ограничение UNIQUE: registroUsuario_customuser.username

Метод запроса: URL-адрес запроса POST: http://127.0.0.1:8000/registro/registrar/ Версия Django: 2.0.9 Тип исключения: IntegrityError Значение исключения:

Не удалось выполнить ограничение UNIQUE:registroUsuario_customuser.username

Расположение исключения: C: \ Users \ riria \ Desktop \ perrosUnidad3 \ myvenv \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ base.py в исполнении, строка 303 Исполняемый файл 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\ Программы \ 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 ']

Время сервера: Lun, 19 ноября 2018 г. 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)
...