Django でユーザー名の長さを 30 から約 80 に増やしたいのですが、質問が重複している可能性があることはわかっていますが、以前の回答は機能しません。たとえば、https://kfalck.net/2010/12/30/longer- django のユーザー名
これは Django 1.2 用です。
誰かがDjango> 1.5で同様のハックを試しましたか よろしくお願いします
Django でユーザー名の長さを 30 から約 80 に増やしたいのですが、質問が重複している可能性があることはわかっていますが、以前の回答は機能しません。たとえば、https://kfalck.net/2010/12/30/longer- django のユーザー名
これは Django 1.2 用です。
誰かがDjango> 1.5で同様のハックを試しましたか よろしくお願いします
私は数日前に同じ問題を抱えていました。最後に、(古い) ユーザー名の最初の 30 文字を (新しいデータベース テーブルに) 切り取り、ユーザー名の代わりに電子メールをチェックするカスタム認証バックエンドを追加するだけで終了しました。私が知っているひどいハック、そして私は時間ができたらすぐにそれを修正することを計画しています. アイデアは次のとおりです。
djangos auth.User と 1 対 1 の関係を持つモデル クラスが既にあります。そこに という別のフィールドを追加しますfull_username
。
class MyCustomUserModel(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL, related_name="custom_user")
full_username = models.CharField(max_length=80, ...)
...
次に、このフィールドをユーザー名としてチェックする別のカスタム認証バックエンドを追加します。次のようになります。
from django.contrib.auth.backends import ModelBackend
class FullUsernameAuthBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
UserModel = get_user_model()
if username is None:
username = kwargs.get(UserModel.USERNAME_FIELD)
try:
user = UserModel._default_manager.filter(custom_user__full_username=username)
# If this doesn't work, will use (the second case):
# user = MyCustomUserModel.objects.filter(full_username=username).user
if user.check_password(password):
return user
except UserModel.DoesNotExist:
# Adding exception MyCustomUserModel.DoesNotExist in "(the second case)"
# Run the default password hasher once to reduce the timing
# difference between an existing and a non-existing user (#20760).
UserModel().set_password(password)
この後、settings.py を変更する必要があります。
AUTHENTICATION_BACKENDS = (
"....FullUsernameAuthBackend",
# I will have the email auth backend here also.
)
うまくいくことを願っています。
カスタム ユーザー モデルは大きな変更であり、常にアプリと互換性があるとは限りません。この非常に実用的な移行を実行することで解決しました。これはデータベースレベルでのみ解決することに注意してください。
migrations.RunSQL("alter table auth_user alter column username type varchar(254);")
Django 1.5 以降では、カスタム ユーザー モデルを作成することをお勧めします。次に、必要に応じてユーザー名フィールドを正確に作成できます。