如何使用Django allauth适配器清理用户名?

0 投票
1 回答
1102 浏览
提问于 2025-04-18 09:30

Django allauth 在用户注册或登录时,会检查用户名是否包含非法字符,并且不区分大小写地确保用户名的唯一性。这一点非常好。但是,我想在自己的个人资料表单中也使用相同的验证规则,这个表单与用户有一对一的关系。目前,我在个人资料表单中无法实现相同的逻辑。

我想过可能是导入 DefaultAccountAdapter 并重写 def clean_username,但是我遇到了以下问题:

TypeError at /accounts/profile/
clean_username() takes exactly 2 arguments (1 given)

我的 forms.py 文件:

from allauth.account.adapter import DefaultAccountAdapter

from .profiles.models import Profile


class UserForm(forms.ModelForm):

    class Meta:
        model = get_user_model()
        fields = ('username', 'first_name', 'last_name',)
        widgets = {
            'username': forms.TextInput(
                attrs={
                    'autocapitalize': 'off',
                    'autocorrect': 'off',
                    'placeholder': 'Username'
                }
            ),
            'first_name': forms.TextInput(
                attrs={
                    'autocapitalize': 'words',
                    'autocorrect': 'off',
                    'placeholder': 'First name'
                }
            ),
            'last_name': forms.TextInput(
                attrs={
                    'autocapitalize': 'words',
                    'autocorrect': 'off',
                    'placeholder': 'Last name'
                }
            ),
        }
        help_texts = {
            'username': '',
        }

    def clean_username(self, username):
        adapter = DefaultAccountAdapter()
        username = adapter.clean_username(username)
        return username

1 个回答

1

我最后搞明白了。之前想得太复杂了。

from allauth.account.adapter import get_adapter

#...

    def clean_username(self):
        value = self.cleaned_data['username']
        value = get_adapter().clean_username(value)
        return value

撰写回答