2013-06-06 22 views

答えて

27

掘り出した後、私はこれを見つけました

https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms

犯人はdjango.contrib.auth.forms.py内部UserCreationForm内部機能clean_usernameあります。いくつかのチケットが作成されましたが、どうやらメンテナは、それが欠陥だとは思わない:このファイルの

https://code.djangoproject.com/ticket/20188

https://code.djangoproject.com/ticket/20086

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: 
      User._default_manager.get(username=username) 
     except User.DoesNotExist: 
      return username 
     raise forms.ValidationError(self.error_messages['duplicate_username']) 

Userは直接組み込み、ユーザモデルに参照しています。それを修正する

、私は私のカスタムは

from models import User #you can use get_user_model 
from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth import forms 

class MyUserCreationForm(UserCreationForm): 
    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: 
      User._default_manager.get(username=username) 
     except User.DoesNotExist: 
      return username 
     raise forms.ValidationError(self.error_messages['duplicate_username']) 

    class Meta(UserCreationForm.Meta): 
     model = User 

class MyUserAdmin(UserAdmin): 
    add_form = MyUserCreationForm 

admin.site.register(User,MyUserAdmin) 

を形成それとも、User変数を置き換えるために、元のUserCreationFormにパッチを適用猿を試すことができます作成​​しました。

+1

ニースキャッチ。 Djangoのドキュメントは、Userモデルを拡張するときに、すぐにこれらのクラスをそのまま使用することを実際に勧めていることを考慮すると、間違いなく対処する必要があります。 – dustinfarris

+1

ちょうど私が探している解決策。 – Charlesliam

+1

それは私の日を救った! – neelix

4

これは、移行が実行されていないためです。この問題は、次のコマンドを実行して、私のために解決されます。

のpython manage.py syncdbの実行に

3

をDjangoの1.8

あなたのアプリはまだcontrib.authとして、これも問題になる可能性の移行を使用していない場合それらを使用します。私のアプリのマイグレーションを有効にすると、私のためにそれを解決しました。

$ ./manage.py makemigrations <my_app> 
$ ./manage.py migrate 
+0

あなたは私の正気を救った。明らかに移行を抹消する場合は、移行フォルダと '__init__ 'を保持する必要があります。Djangoは最初の移行を作成することができず、続いて 'migrate'に失敗します。 –

0

のみ、その後残りの最初のアプリ(カスタム・ユーザー・モデルとの1)を移行し、そして:また、これが自動的に行われますことを確認する移行の順序を制御することができます

$ ./manage.py makemigrations <your_app> 
$ ./manage.py migrate 
$ ./manage.py makemigrations 
$ ./manage.py migrate 

を、https://docs.djangoproject.com/en/1.10/howto/writing-migrations/#controlling-the-order-of-migrationsを参照してください

関連する問題