2013-02-05 25 views
16

AUTH_USER_MODEL錯誤在EDIT3中解決。用戶通過表單創建密碼仍然不會保存。AUTH_USER_MODEL是指未安裝和創建的模型.. AbstractUser模型無法登錄

我正在使用Django 1.5玩弄新的用戶覆蓋/擴展功能,並且我無法通過我的註冊表單註冊新用戶 - 只能通過管理員註冊。當通過登記表登記,我得到以下錯誤:

Manager isn't available; User has been swapped for 'poker.PokerUser'

models.py:

class PokerUser(AbstractUser): 
    poker_relate = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) 
    token = models.EmailField() 
    USER_CHOICES = (
     ('1', 'Staker'), 
     ('2', 'Horse') 
    ) 
    user_type = models.CharField(choices=USER_CHOICES, max_length=10) 
    username1 = models.CharField(null=True, blank=True, max_length=40) 
    username2 = models.CharField(null=True, blank=True, max_length=40) 
    username3 = models.CharField(null=True, blank=True, max_length=40) 
    username4 = models.CharField(null=True, blank=True, max_length=40) 
    username5 = models.CharField(null=True, blank=True, max_length=40) 

PokerUserForm型號:

class PokerUserForm(UserCreationForm): 
    class Meta: 
     model = PokerUser 
     fields = ('username','password1','password2','email','user_type','token','username1','username2','username3','username4','username5',) 

我已經嘗試改變模型在PokerUserForm模型中使用get_user_model()而不是通過設置來明確定義模型代替model = PokerUser但後來我收到以下錯誤:

django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed 

AUTH_USER_MODEL是建立在我的settings.py像這樣:

AUTH_USER_MODEL = 'poker.PokerUser'

在我們去 - 在views.py我報名的看法:

def UserRegistration(request): 
    player = PokerUser() 

    if request.method == 'POST': 
     form = PokerUserForm(request.POST, instance=player) 
     if form.is_valid(): 
      player.email_address = form.cleaned_data['email'] 
      player.user_type = form.cleaned_data['user_type'] 
      # if player is staker, token is their own email. otherwise their token is their staker's email and 
      # their relation is their staker 
      if player.user_type == '1' or player.user_type == 'staker': 
       player.token = player.email_address 
      else: 
       player.token = form.cleaned_data['token'] 
       staker = PokerUser.objects.get(email=player.token) 
       player.poker_relate = staker 
      player.save() 
      return HttpResponseRedirect('/') 
    else: 
     form = PokerUserForm() 
    initialData = {'form': form} 
    csrfContext = RequestContext(request, initialData) 
    return render_to_response('registration/register.html', csrfContext) 

EDIT1:

According to the docsUserCreationForm必須重新創建用於自定義用戶類。

我推翻整個UserCreationForm如下:

class UserCreationForm(forms.ModelForm): 
    """ 
    A form that creates a user, with no privileges, from the given username and 
    password. 
    """ 
    error_messages = { 
     'duplicate_username': _("A user with that username already exists."), 
     'password_mismatch': _("The two password fields didn't match."), 
     } 
    username = forms.RegexField(label=_("Username"), max_length=30, 
     regex=r'^[\[email protected]+-]+$', 
     help_text=_("Required. 30 characters or fewer. Letters, digits and " 
        "@/./+/-/_ only."), 
     error_messages={ 
      'invalid': _("This value may contain only letters, numbers and " 
         "@/./+/-/_ characters.")}) 
    password1 = forms.CharField(label=_("Password"), 
     widget=forms.PasswordInput) 
    password2 = forms.CharField(label=_("Password confirmation"), 
     widget=forms.PasswordInput, 
     help_text=_("Enter the same password as above, for verification.")) 

    class Meta: 
     model = PokerUser 
     fields = ('username','password1','password2','email','user_type','token','username1','username2','username3','username4','username5',) 

    def clean_username(self): 
     # Since User.username is unique, this check is redundant, 
     # but it sets a nicer error message than the ORM. See #13147. 
     username = self.cleaned_data["username"] 
     try: 
      PokerUser.objects.get(username=username) 
     except PokerUser.DoesNotExist: 
      return username 
     raise forms.ValidationError(self.error_messages['duplicate_username']) 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError(
       self.error_messages['password_mismatch']) 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

而這是能夠解決這個錯誤:

The Manager isn't available; User has been swapped for 'poker.PokerUser'

現在,請創建用戶,但無法登錄。當我檢查管理員中的用戶時,除密碼外,所有信息似乎都是正確的。在管理員中手動添加密碼似乎無法正常工作。但是,通過管理員正確地添加用戶。

編輯2:

我仍然無法登錄任何通過註冊形式創建了AbstractUser車型。我已經完全覆蓋了UserCreationForm正如上文所述,並且是無法實施 get_user_model()與此錯誤:

AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed

get_user_model() Django的代碼是:

def get_user_model(): 
    "Return the User model that is active in this project" 
    from django.conf import settings 
    from django.db.models import get_model 

    try: 
     app_label, model_name = settings.AUTH_USER_MODEL.split('.') 
    except ValueError: 
     raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'") 
    user_model = get_model(app_label, model_name) 
    if user_model is None: 
     raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL) 
    return user_model 

因爲我在AUTH_USER_MODEL = 'poker.PokerUser'設置我的settings.py,這應該工作。我通過Django控制檯驗證了這一點:

>>> from django.contrib.auth import get_user_model 
>>> settings.AUTH_USER_MODEL 
Out[14]: 'poker.PokerUser' 
>>> from django.db.models import get_model 
>>> app_label, model_name = settings.AUTH_USER_MODEL.split('.') 
>>> user_model = get_model(app_label, model_name) 
>>> user_model 
Out[18]: poker.models.PokerUser 

但是,實現仍然無法正常工作。

如果你已經閱讀了這麼多,謝謝!

EDIT3:

AUTH_USER_MODEL refers to model 'poker.PokerUser' that has not been installed已定。我不小心有UserCreationForm,我在poker.models,而不是registration.forms重新創建,所以當我跑get_user_model()分配到poker.PokerUser,它不能解決,因爲它已經在該位置。

現在唯一剩下的問題是,當創建新用戶時,他們的密碼不會保存。我已經在這裏放置打印報表範圍縮小在UserCreationForm一個方法:

def clean_password2(self): 
    password1 = self.cleaned_data.get("password1") 
    print password1 
    password2 = self.cleaned_data.get("password2") 
    print password2 
    if password1 and password2 and password1 != password2: 
     raise forms.ValidationError(
      self.error_messages['password_mismatch']) 
    print password2 
    return password2 

def save(self, commit=True): 
    user = super(UserCreationForm, self).save(commit=False) 
    user.set_password(self.cleaned_data["password1"]) 
    print self.cleaned_data["password1"] 
    if commit: 
     user.save() 
    return user 

clean_password2顯示明文密碼的print password1print password1語句,但print self.cleaned_data["password1"]save方法是空白。爲什麼我的表單數據沒有傳遞給保存方法?

TL; DRAbstractUser模型創建在管理員和註冊表單中均有效,但只有通過管理員創建的用戶才能夠登錄。通過註冊表單創建的用戶無法登錄,似乎無需密碼即可保存 - 所有其他信息均可正確保存。

回答

11

好的,這裏有三個問題對我來說,所以我要解決所有問題,因爲我非常確定前兩個問題會出現在其他人身上。

  • Manager isn't available; User has been swapped for 'poker.PokerUser'

這是由於使用而不是重新創建UserCreationForm。在1.5中使用自定義模型時,可以使用一些模型表單,但必須重新創建這個模型表單。有關文檔,請參閱here

  • The Manager isn't available; User has been swapped for 'poker.PokerUser'

雖然我在settings.pyAUTH_USER_MODEL = 'poker.PokerUser'集,我打電話從poker.models位置get_user_model()。您必須從其他地點撥打get_user_model()。將我的表單移動到registration.forms,並從那裏調用get_user_model()正常工作。

  • 新用戶不節能

這只是在我結束大腦放屁。在我的UserRegistration模型中,我操縱表單中的各個領域。當我將這些字段傳遞迴UserCreationFormsave()方法時,我沒有通過密碼字段。 Woops!

-5

引述Django文檔:您admin.py文件的

You will also need to register your custom User model with the admin. If your custom User model extends django.contrib.auth.models.AbstractUser, you can use Django's existing django.contrib.auth.admin.UserAdmin class.

檢查的內容,並確保您註冊您的自定義模型使用django.contrib.auth.admin.UserAdmin類管理系統。

+3

你引用具體涉及到管理文檔。這個問題不適用於管理員。在管理員中創建用戶可正常工作。問題是在管理員之外創建用戶。 –

+0

問題是:用管理員創建的用戶是否合適?你有沒有配置管理員使用你的新模型? – stefanw

+1

雖然我當然非常感謝您的時間和答案,但我在原來的文章中已經努力解決所有這些問題。請參見最後一段 - 「現在,用戶已創建,但無法登錄。當我檢查管理員中的用戶時,除密碼外,所有信息似乎都正確。在管理員中手動添加密碼似乎無法正常工作,但仍然可以通過管理員正確地添加用戶。「在管理員中創建的用戶正常工作。覆蓋UserCreationForm後,用戶現在在admin之外創建,但不正確。 –

7

我碰到過這幾次。這始終是一個進口問題。假設我們有核心/ models.py實現自定義的用戶,並從另一個文件(否則)導入符號:

from Something import Else 

class CustomUser(AbstractBaseUser): 
    pass 

然後我們有一個使用CustomUser另一個文件,還定義否則。讓我們把這個東西/ models.py:

from core.models import CustomUser 

class Else(models.Model): 
    pass 

class AnotherClass(models.model): 
    user = models.ForeignKey(CustomUser) 

當核心/ models.py去到別的進口,它計算的東西/ models.py並運行到AnotherClass定義。 AnotherClass使用CustomUser,但CustomUser尚未安裝,因爲我們正在創建它。所以,它會拋出這個錯誤。

我已經解決了這個問題,保持我的核心/ models.py獨立。它不會從我的其他應用程序導入太多。

+0

因爲我是Python的新手,還是Python的民間人士通常也被討厭的導入問題激怒,我是不是很煩?隨着項目的發展,追蹤它們是不可能的! – nakajuice

0

在我的情況下更新,在適當的薈萃解決app_label這個問題

class APPUser(AbstractUser): 
    password = models.TextField(blank=True) 

    class Meta: 
    app_label = 'app_auth' 
    db_table = "app_user"