1

ThieはDjangoのソースコードで、「xxx///\」という名前のユーザーのパーミッションを変更するとエラーになるのですが、実はこの形式のユーザー名をブロックしたくないので上書きしたいのです。ユーザー変更フォーム クラス。これを行う方法を教えてください。ありがとう!

class UserChangeForm(forms.ModelForm):
    username = forms.RegexField(
        label=_("Username"), max_length=30, regex=r"^[\w.@+-]+$",
        help_text = _("Required. 30 characters or fewer. Letters, digits and "
                      "@/./+/-/_ only."),
        error_messages = {
            'invalid': _("This value may contain only letters, numbers and "
                         "@/./+/-/_ characters.")})
    password = ReadOnlyPasswordHashField(label=_("Password"),
        help_text=_("Raw passwords are not stored, so there is no way to see "
                    "this user's password, but you can change the password "
                    "using <a href=\"password/\">this form</a>."))

    def clean_password(self):
        return self.initial["password"]

    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserChangeForm, self).__init__(*args, **kwargs)
        f = self.fields.get('user_permissions', None)
        if f is not None:
            f.queryset = f.queryset.select_related('content_type')

私は最終的にメソッドを見つけ、これをAdmin.pyに追加します

from django.contrib.auth.admin import UserAdmin
# overwrite the UserChangeForm
class UserChangeForm(forms.ModelForm):
    username = forms.RegexField(
        label=_("Username"), max_length=30, regex=r"^[a-zA-Z0-9@\.+-_\/\\]+$",
        help_text = _("Required. 30 characters or fewer. Letters, digits and "
                      "@/./+/-/_ only."),
        error_messages = {
            'invalid': _("This value may contain only letters, numbers and "
                         ".")})
UserAdmin.form = UserChangeForm

ありがとうございます

4

1 に答える 1

0

あなたの正規表現はあなたが望むことをしていません。正規表現に関するいくつかのチュートリアルを見つけてください (google 'Regex Tutorial')。次に、正規表現をテストするためのソフトウェアを入手することをお勧めします( WindowsのRegex Coachは素晴らしいです)。

表現だと思います^[a-zA-Z0-9@\.+-_\/\\]+$。あなたが探していることをすべきです。ヘルプとエラー テキストも変更する必要があります。実際には、受け入れていると言っている文字以外の追加の文字を受け入れています。max_length最後に、既存のヘルプ テキストと一致するフィールドを追加します。

class CustomChangeForm(forms.ModelForm):
    username = forms.RegexField(
        label=_("Username"), max_length=30, regex=r"^[a-zA-Z0-9@\.+-_\/\\]+$",
        help_text = _("Required. 30 characters or fewer. Letters, digits and "
                      "@.+-_/\ only."),
        error_messages = {
            'invalid': _("This value may contain only letters, numbers and "
                         "@.+-_/\ characters.")}),
        max_length=30)
        ....

編集

UserChangeForm をオーバーライドするには、class ステートメントを書き直して、フォームが ModelForm ではなく UserChangeForm から継承されるようにします。

from django.contrib.auth.forms import UserChangeForm

class CustomChangeForm(UserChangeForm):
    username = forms.RexField(
        ...

Django フォームでの継承の詳細については、ドキュメントを参照してください。

于 2012-11-26T07:41:34.100 に答える