2013-03-31 39 views
6

Tôi đã mở rộng mô hình người dùng django 1.5 như dưới đây và tôi đang gặp sự cố khi tôi chèn bất kỳ hàng nào vào cơ sở dữ liệu. Tệp models.py của tôi trông giống như dưới đây.mô hình người dùng tùy chỉnh trong 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 

Và admin.py của tôi trông giống như dưới đây.

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) 

Tôi làm theo các trên từ các hướng dẫn django (https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example)

Bây giờ vấn đề tôi đang gặp là bất cứ khi nào tôi sửa đổi gì trong admin, tôi nhận được một thông báo lỗi nói rằng bên dưới.

(1452, 'Không thể thêm hoặc cập nhật một hàng con:. Một ràng buộc khoá ngoại thất bại (csiopdjango_admin_log, CONSTRAINT user_id_refs_id_c8665aa KEY NƯỚC NGOÀI (user_id) THAM KHẢO auth_user (id))')

Vì vậy, có vẻ như Bảng django_admin_log luôn cần tham chiếu khóa ngoài tới mô hình auth_user. Nhưng vì tôi đã tạo một mô hình người dùng của khách hàng, khi tôi tạo một người dùng siêu chi tiết người dùng chỉ được lưu trữ trong bảng MyUser của khách hàng và không có mục nhập nào được tạo trong mô hình auth_user, điều này có vẻ gây ra vấn đề.

Làm cách nào để giải quyết vấn đề này? Xin đề nghị.

Cảm ơn Sreekanth

+0

Bạn đã đặt 'AUTH_USER_MODEL' trong cài đặt của mình chưa? https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model – Ngenator

+0

Có. tôi có AUTH_USER_MODEL được đặt để trỏ tới MyUser tùy chỉnh. – Dev

Trả lời

7

này trông rất giống một (PostgreSQL) lỗi cơ sở dữ liệu - không phải là một lỗi Django. "auth_user" (vẫn) được tham chiếu trong ràng buộc ForeignKey trong cấu trúc cơ sở dữ liệu của bạn. Một thứ như vậy không nên tồn tại với mô hình tùy chỉnh của bạn, được gọi là "MyUser". Trong trường hợp này, tham chiếu phải giống như "accounts_myuser" hoặc "myappname_myuser".

Tôi đoán, bạn đã cập nhật mã đã tồn tại bao gồm cơ sở dữ liệu cũ. Nếu bạn không cần nhật ký quản trị cũ, chỉ cần xóa/thả bảng có tên "django_admin_log" và sau đó chạy "python manage.py syncdb" (hoặc "python manage.py migrate" là 1.7) để cho phép Django tạo lại bảng này từ đầu.

Hãy cẩn thận, mặc dù: Nếu bạn có các bảng khác tham chiếu đến mô hình Người dùng Django "cũ", bạn sẽ chạy lại vào cùng một loại sự cố ở các vị trí khác.

4

Tôi đã gặp sự cố tương tự. Một khi bạn trao đổi ra mô hình người dùng Django mặc định cho một tùy chỉnh của riêng bạn, Django không làm bất cứ điều gì để làm sạch phụ thuộc cũ từ cơ sở dữ liệu không còn được sử dụng. Thực tế có một vài bảng "auth_ *" có ràng buộc khóa ngoài trên bảng "auth_user".

Khi bạn đã chuyển sang mô hình xác thực mới, hãy đảm bảo không có dữ liệu bạn cần trong bất kỳ bảng "auth_ *" và "django_admin_log" nào, thả chúng và chạy lại "manage.py syncdb" . Bạn sẽ nhận thấy nó không tái tạo bảng auth_user vì nó không còn được sử dụng nữa và ràng buộc pesky đã biến mất.

Các vấn đề liên quan