2013-05-05 40 views
7

Tôi đang cố gắng thiết lập mô hình người dùng tùy chỉnh của mình ở Django. Lý do là tôi muốn sử dụng email làm tên người dùng và xóa hoàn toàn trường tên người dùng. Tôi đã gặp phải một lỗi, rằng tôi không thể hiểu được.Lỗi mô hình người dùng tùy chỉnh

Manager isn't available; User has been swapped for 'app.MyUser' 
Exception Location: .../django/db/models/manager.py in __get__, line 256 
Python Version: 2.7.3 

Python Path:  
[...project specific files, 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', 
'/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', 
'/usr/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages/PIL', 
'/usr/lib/python2.7/dist-packages/gtk-2.0', 
'/usr/lib/pymodules/python2.7', 
'/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode'] 

Tôi đã googled như điên, nhưng không tìm thấy quá nhiều trang về thông báo lỗi này. Tôi đã tìm thấy một số trang, với những gợi ý về cách giải quyết nó, nhưng không có gợi ý nào đã làm việc cho tôi.

Mã của tôi: Tôi đã đặt mô hình người dùng tùy chỉnh. Tôi đã khai báo mô hình người dùng tùy chỉnh AUTH_USER_MODEL = 'app.MyUser' trong settings.py. Tôi cũng đã thiết lập UserManager tùy chỉnh:

class MyUserManager(BaseUserManager): 

    def create_user(self, email, password=None): 
     """ 
     Creates and saves a User with the given email. Note that none of the optional fields gets values in the creation. These fields will have to be filled out later on. 
     """ 

     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=None): 
     """ 
     Creates and saves a superuser with the the above mentioned attributes 

     """ 

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


class MyUser(AbstractBaseUser, PermissionsMixin): 
    """ 
    Custom made User model. No username, instead email is used as unique field and index 
    """ 

    Genders = (('M', 'Man'), ('K', 'Woman'))  
    FirstName = models.CharField(max_length=30) 
    LastName = models.CharField(max_length=40) 
    Gender = models.CharField(max_length=2, choices=Genders, default='K') 
    email = models.EmailField(verbose_name='email address', max_length=255, unique=True, db_index=True,) 
    twitter = models.CharField(max_length=30) 
    is_admin = models.BooleanField(default=False) 


    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [] 

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

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

    def __unicode__(self): 
     return self.email 

    objects = MyUserManager() 

Tôi đã cố gắng khai báo với các loại UserAdmins khác nhau, không cái nào trong số đó tạo nên sự khác biệt, cái đầu tiên tôi đã thử là;

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

    list_display = ('email', 'FirstName', 'LastName', 'Gender', 'twitter') 
    list_filter =() 

    add_fieldsets = ((None, {'classes': ('wide',),'fields': ('email', 'password1', 'password2')}),) 

    search_fields = ('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

admin.site.register(MyUser, MyUserAdmin) 

tôi đã nhận xét ra hai thuộc tính add_formform vì họ nêu ra một số lỗi hình thức tôi muốn quay trở lại tại một điểm sau đó.

Tài khoản người dùng thứ hai được tạo, sau khi đọc về bản sửa lỗi có thể có here. Điều này đã không giúp tình hình mặc dù;

class MyUserAdmin(admin.ModelAdmin): 
    # The forms to add and change user instances 
    #form = UserChangeForm 
    add_form = FrontpageRegistrationForm 
    add_fieldsets = ((None, {'classes': ('wide',),'fields': ('email', 'password1', 'password2')}),) 

    def get_fieldsets(self, request, obj=None): 
     if not obj: 
      return self.add_fieldsets 
     return super(MyUserAdmin, self).get_fieldsets(request, obj) 

    def get_form(self, request, obj=None, **kwargs): 
     defaults = {} 
     if obj is None: 
      defaults.update({'form': self.add_form,'fields': admin.util.flatten_fieldsets(self.add_fieldsets),}) 

    defaults.update(kwargs) 
    return super(MyUserAdmin, self).get_form(request, obj, **defaults) 

Tôi cũng đã thử xóa tất cả các bảng trong db mà không có may mắn.

Tôi sẽ vô cùng vĩ đại với bất kỳ ai thậm chí xem xét vấn đề. Và nếu có ai giải quyết vấn đề này, tôi sẽ cố hết sức để nói chuyện với vợ tôi về việc đặt tên cho đứa con đầu lòng của chúng ta sau khi Thế Thần trao cho tôi một giải pháp để tôi có thể tiếp tục sống.

EDIT: Tôi đã thử đặt AUTH_USER_MODEL thành mainfolder.app.MyUser Tôi chắc chắn rằng "thư mục chính" nằm trên đường dẫn con trăn. init .py trong ứng dụng phải chính xác. Cài đặt mới.py đã đưa ra lỗi máy chủ sau; auth.user: AUTH_USER_MODEL is not of the form 'app_label.app_name'.admin.logentry: 'user' has a relation with model smartflightsearch.SFSdb.MyUser, which has either not been installed or is abstract.registration.registrationprofile: 'user' has a relation with model, which has either not been installed or is abstract. Một manh mối mới Tôi không biết làm thế nào để giải thích ..

+0

Tên ứng dụng của bạn có phải là '' ứng dụng '' không? – Rohan

+0

Trước hết, đừng hoảng sợ, chúng tôi sẽ giải quyết vấn đề này. :) Khi nào bạn thấy lỗi? Lỗi có biến mất nếu bạn tắt quản trị viên không? Bạn đã thử gỡ lỗi ở chế độ từng bước chưa? –

+0

@Ivan Ok, thật tuyệt vời khi nghe :) Lỗi xảy ra sau khi nhập thông tin đăng nhập người dùng trên/admin và nhấn "đăng nhập". Tôi hy vọng lỗi sẽ biến mất nếu tôi tắt quản trị viên, Không có cơ hội để kiểm tra ngay bây giờ, Nhưng các trang không liên quan đến quản trị hoạt động tốt. – Rookie

Trả lời

8

TL; DR: Sử dụng mã từ Giải pháp phần ở phần cuối của câu trả lời sau đây.

lời giải thích dài: Bạn thấy, tính đến Django 1,5, nó không đủ để phân lớp của Django UserAdmin để có thể tương tác với các mô hình sử dụng swappable: bạn cần phải ghi đè lên các hình thức tương ứng là tốt.

Nếu bạn nhảy đến django.contrib.auth.admin source, bạn sẽ thấy rằng UserAdmin'sformadd_form có các giá trị:

# django/contrib/auth/admin.py 
class UserAdmin(admin.ModelAdmin): 
    ... 
    form = UserChangeForm 
    add_form = UserCreationForm 

nào chỉ cho chúng ta forms in django.contrib.auth.forms rằng không tôn trọng mô hình sử dụng swappable:

# django/contrib/auth/forms.py 
class UserCreationForm(forms.ModelForm): 
    ... 
    class Meta: 
     model = User # non-swappable User model here. 

class UserChangeForm(forms.ModelForm): 
    ... 
    class Meta: 
     model = User # non-swappable User model here. 

Giải pháp: Vì vậy, bạn nên theo dõi một số lượng lớn đã tồn tại answer (đừng quên bỏ phiếu!) mà nắm này:

from django.contrib.auth import get_user_model 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm, UserChangeForm 

class MyUserChangeForm(UserChangeForm): 
    class Meta: 
     model = get_user_model() 

class MyUserCreationForm(UserCreationForm): 
    class Meta: 
     model = get_user_model() 

class MyUserAdmin(UserAdmin): 
    form = MyUserChangeForm 
    add_form = MyUserCreationForm 

admin.site.register(MyUser, MyUserAdmin) 

Hy vọng rằng, điều này sẽ được cố định trong các phiên bản tương lai của Django (đây là corresponding ticket trong bộ theo dõi lỗi).

+1

Kính gửi @Ivan, thành thật mà nói, tôi không thể tin được bạn đã loại như thế nào, chi tiêu quá nhiều thời gian và năng lượng của bạn để giúp tôi với điều này. Nỗ lực của bạn thật sự được đánh giá cao! Tôi muốn có một loại huy hiệu anh hùng nào đó mà mỗi người dùng chỉ có thể đưa ra một lần. Nếu một thứ như vậy tồn tại, tôi sẽ trao huy hiệu cho bạn! Tôi không có thời gian để làm việc với vấn đề ngày hôm nay, tất cả những gì tôi đã cố gắng là sao chép các biểu mẫu và UserAdmin từ giải pháp của bạn. Điều đó đưa ra một thông báo lỗi, nhưng dường như nó xuất phát từ thực tế là tất cả các trường trong mô hình Người dùng, chưa được khai báo trong các biểu mẫu thay đổi/tạo. Lt u knw tmrw – Rookie

+1

Cảm ơn bạn rất nhiều! Và có lẽ tôi nên đưa cho bạn huy hiệu "nhận xét tốt nhất mà tôi từng nhận được".:))) –

+0

Tôi không biết, đây có lẽ không phải là nơi tốt nhất để viết điều này, nhưng bằng cách nào đó tôi có thể vẽ chân dung bạn như một người rất trưởng thành coi trọng mọi người xung quanh và biết cách quan tâm đến họ. Bạn nhắc tôi về ông tôi. –

2

Khi bạn nói bạn thiết AUTH_USER_MODEL = 'app.MyUser' Tôi giả định ứng dụng của bạn, nơi tọa lạc các lớp MyUser, có một cấu trúc, perharps, như thế này:

bên trong ứng dụng/dir: init py và models.py và các công cụ ..

nên bên trong models.py bạn có MyUser và bên trong init py:

from models import MyUser

+0

Cảm ơn bạn đã dành thời gian để xem xét vấn đề của tôi @ user1808134. Có, ứng dụng có chứa __init__.py. Tôi đã không tuyên bố bất cứ điều gì trong đó, nhưng đã làm như vậy bây giờ, sau khi nhìn thấy câu trả lời của bạn. Tôi đã chèn '__all__ = ['views', 'tests', 'static', 'models', 'admin',]' nhưng không có kết quả, cùng một lỗi xảy ra khi nhấn "đăng nhập" trên trang quản trị (PS. đã thử với các mô hình nhập MyUser trong tập tin __init__.py – Rookie

+0

Tôi đã thử đặt 'AUTH_USER_MODEL' thành' mainfolder.app.MyUser'Tôi chắc chắn rằng "mainfolder" nằm trên pythonpath. Tôi vẫn có __init__.py như trên . Settings.py mới đã cung cấp lỗi máy chủ sau: 'auth.user: AUTH_USER_MODEL không có dạng 'app_label.app_name'.admin.logentry:' user 'có quan hệ với mô hình smartflightsearch.SFSdb.MyUser, có chưa được cài đặt hoặc là abstract.registration.registrationprofile: 'người dùng' có quan hệ với mô hình, đã hoặc chưa được cài đặt hoặc trừu tượng. 'Điều này có đưa ra bất kỳ gợi ý nào không? – Rookie

+0

Tôi đã thực hiện một số nghiên cứu về vấn đề này và không tìm thứ gì đó khai sáng =/ Lần cuối cùng tôi làm việc với ne w Django tùy chỉnh auth, tôi đã làm theo hướng dẫn từ các tài liệu django, mà tôi biết nó không phải là nhiều. – user1808134

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