2013-03-31 2 views
6

아래의 django 1.5 사용자 모델을 확장했으며 데이터베이스에 행을 삽입 할 때 문제가 있습니다. 내 models.py 파일은 다음과 같습니다.django 사용자 정의 사용자 모델 1.5

class MyUserManager(BaseUserManager): 

    def create_user(self, email, password=None): 

    if not email: 
     raise ValueError('Users must have an email address') 

    user = self.model(
     email=MyUserManager.normalize_email(email), 
    ) 

    user.set_password(password) 
    user.save(using=self._db) 
    return user 

    def create_superuser(self, email, password): 

    user = self.create_user(email, 
     password=password 
    ) 
    user.is_admin = True 
    user.save(using=self._db) 
    return user 


class MyUser(AbstractBaseUser): 
    email = models.EmailField(
     verbose_name='Email address', 
     max_length=255, 
     unique=True, 
     db_index=True, 
    ) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 

    def get_full_name(self): 
     # The user is identified by their email address 
     return self.email 

    def __unicode__(self): 
     return self.email 

내 admin.py는 다음과 같습니다.

class MyUserAdmin(UserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 

    # The fields to be used in displaying the User model. 
    # These override the definitions on the base UserAdmin 
    # that reference specific fields on auth.User. 
    list_display = ('email', 'is_admin') 
    list_filter = ('is_admin',) 
    fieldsets = (
    (None, {'fields': ('email', 'password')}), 
    ('Permissions', {'fields': ('is_admin',)}), 
    ('Important dates', {'fields': ('last_login',)}), 
    ) 
    add_fieldsets = (
    (None, { 
     'classes': ('wide',), 
     'fields': ('email', 'password1', 'password2')} 
    ), 
    ) 
    search_fields = ('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

// Now register the new UserAdmin... 
admin.site.register(MyUser, MyUserAdmin) 
// ... and, since we're not using Django's builtin permissions, 
// unregister the Group model from admin. 
admin.site.unregister(Group) 

나는 지금 내가 데 문제가 내가, 내가 오류 메시지가 아래 말하는 무엇입니까 관리자에 아무것도 수정 때마다입니다 장고 튜토리얼 ( https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example)

에서 위 따랐다.

(1452, '추가 또는 자식 행을 업데이트 할 수 없습니다가 :. 외래 키 제약 조건이 실패 ( csiop django_admin_log, CONSTRAINT user_id_refs_id_c8665aa FOREIGN KEY ( user_id는) 참고 문헌 ( id가)) auth_user')

그래서, 모습 django_admin_log 테이블은 항상 auth_user 모델에 대한 외부 키 참조가 필요합니다. 그러나 고객 사용자 모델을 만들었으므로 수퍼 유저를 만들 때 사용자 세부 정보는 고객 MyUser 테이블에만 저장되며 auth_user 모델에는 항목이 생성되지 않으므로 문제가 발생하는 것으로 보입니다.

어떻게이 문제를 해결할 수 있습니까? 제발 제안 해주세요. 스리 칸스

+0

설정에'AUTH_USER_MODEL'을 (를) 설정 했습니까? https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model – Ngenator

+0

예. 사용자 정의 MyUser를 가리 키도록 AUTH_USER_MODEL을 설정했습니다. – Dev

답변

7

이는 (PostgreSQL을) 데이터베이스 오류처럼 많이 보이는

감사합니다 -하지 장고 오류가 발생했습니다. "auth_user"는 (여전히) 데이터베이스 구조의 ForeignKey 제약 조건에서 참조됩니다. MyUser라고하는 사용자 지정 모델에는 이러한 것이 없어야합니다. 이 경우 참조는 "accounts_myuser"또는 "myappname_myuser"와 같아야합니다.

이전 데이터베이스를 포함하여 이미 존재하는 코드를 업데이트 한 것 같습니다. 이전 관리자 로그가 필요 없다면 "django_admin_log"테이블을 삭제/삭제 한 다음 "python manage.py syncdb"(또는 "python manage.py migrate"1.7)를 실행하여 장고를 다시 만들 수 있습니다. 이 테이블을 처음부터.

비록 "이전"장고 사용자 모델을 참조하는 다른 테이블이 있으면 다른 위치에서 같은 종류의 문제로 다시 실행됩니다.

4

동일한 문제가 발생했습니다. Django는 사용자 정의 된 기본 Django 사용자 모델을 교체 한 후에는 더 이상 사용되지 않는 오래된 종속성을 데이터베이스에서 제거하지 않습니다. 사실 "auth_user"테이블에 외래 키 제약 조건이있는 "auth_ *"테이블이 있습니다.

새로운 인증 모델로 전환 한 후에는 "auth_ *"및 "django_admin_log"테이블에 필요한 데이터가 없는지 확인한 후 삭제하고 "manage.py syncdb"를 다시 실행하십시오. . auth_user 테이블이 더 이상 사용되지 않고 성가신 제약 조건이 사라짐에 따라 auth_user 테이블을 다시 생성하지 않는다는 것을 알 수 있습니다.

관련 문제