3

ユーザーがパスワードに加えてユーザー名または電子メールでログインできるようにするカスタムバックエンドを追加しました。メールが30文字を超える場合を除いて、正常に機能します。私が得るフォームエラーは次のとおりです。

"Ensure this value has at most 30 characters (it has 35)."

私のアプリのurls.pyファイルの1つで、次のようにユーザー名フィールドのmax_lengthをオーバーライドしました。

from django.contrib.auth.forms import AuthenticationForm
AuthenticationForm.base_fields['username'].max_length = 75

ここで説明するclass_preparedシグナル手法も試しました。

http://stackoverflow.com/questions/2610088/can-djangos-auth-user-username-be-varchar75-how-could-that-be-done/2613385#2613385

ここでどこが間違っているのかわかりません。助けてくれてありがとう。

4

3 に答える 3

4

フォームのユーザー名フィールドの長さを変更するだけの場合(データベースのユーザー名フィールドの長さを変更しない場合)、正しい解決策は、AuthenticationFormを次のようにサブクラス化することです。

from django import forms
from django.contrib.auth.forms import AuthenticationForm

class MyAuthenticationForm(AuthenticationForm):
    username = forms.CharField(label="Username", max_length=75)

実際、AuthenticationFormのdocstringには、「ユーザーを認証するための基本クラス。これを拡張して、ユーザー名/パスワードのログインを受け入れるフォームを取得する」とさえ書かれています。

テンプレートやビューなどで、古いAuthenticationFormの代わりに新しいフォームを使用します。

コードが機能しない理由については、AuthenticationFormが他の場所にインポートされる前に、アプリのurls.pyが読み込まれていないと思います。それが理由だと断言できませんでしたが、それが最も可能性が高いです。

于 2010-11-06T08:36:01.990 に答える
0

私の推測:urls.pyでの使用:

from django.contrib.auth.views import login

...

    (r'^accounts/login/$', login),

「遅延評価」フォームの代わりに:

(r'^accounts/login/$', 'django.contrib.auth.views.login'),
于 2010-11-06T06:04:00.607 に答える
0

最良の方法は、このコードをトップレベルのinitに追加することです。

# Added so the login field can take email addresses longer than 30 characters
from django.contrib.auth.forms import AuthenticationForm

AuthenticationForm.base_fields['username'].max_length = 75
AuthenticationForm.base_fields['username'].widget.attrs['maxlength'] = 75
AuthenticationForm.base_fields['username'].validators[0].limit_value = 75

ただし、上記の@Gabriel Hurleyの回答を選択した場合は、次のコードを使用してログインフォームに渡すことができます。

(r'^accounts/login/$', 'django.contrib.auth.views.login', {
    'authentication_form': AuthenticationForm
}),
于 2012-10-30T18:28:57.980 に答える