【问题标题】:Django Rest Framework - Field username with ".", "-", "_" characterDjango Rest Framework - 带有“.”、“-”、“_”字符的字段用户名
【发布时间】:2017-03-16 16:09:26
【问题描述】:

我想从我的后端 API 中允许,任何用户都可以在其username 字段中的其他字符之间使用.-_ñ 等字符创建,即primary_key=True,

我以这种方式定义我的自定义用户 (AbstractBaseUser),与我感兴趣的 username 字段相关:

class User(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(
        _('username'),
        max_length=30,
        primary_key=True,
        unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[
            RegexValidator(
                r'^[\w.@+-]+$',
                _('Enter a valid username. This value may contain only '
                  'letters, numbers ' 'and @/./+/-/_ characters.')
            ),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    email = models.EmailField(max_length=254, unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    objects = UserManager()

我的UserSerializer 是这个:

class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(validators=[UniqueValidator(queryset=User.objects.all(), message='Lo sentimos, existe un fichaje con este nombre de usuario')])
    email = serializers.EmailField(validators=[UniqueValidator(queryset=User.objects.all(), message='Lo sentimos, alguien ya ha sido fichado con este correo electrónico')])

    class Meta:
        model = User
        fields = ('url', 'username', 'password', 'first_name','last_name',
                  'age','other fields ...',)

我的 UserViewSet 如下:

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    filter_fields = ('username', 'is_player', 'first_name', 'last_name', 'team' , 'email', )

路由器在 urls.py 中以这种方式定义

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

当我在username 字段中创建具有. 字符的用户时,例如bacalao.cevichica,该用户已创建,但是当我转到localhost:8000/api/users/

我收到这条消息:

File "/home/bgarcial/.virtualenvs/fuupbol2/lib/python3.5/site-packages/django/urls/resolvers.py", line 392, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns)
django.urls.exceptions.NoReverseMatch: Reverse for 'user-detail' with arguments '()' and keyword arguments '{'pk': 'bacalao.cevichica'}' not found. 2 pattern(s) tried: ['api/users/(?P<pk>[^/.]+)\\.(?P<format>[a-z0-9]+)/?$', 'api/users/(?P<pk>[^/.]+)/$']

我对正则表达式不是很熟悉,RegexValidator 可能格式不正确?

另外,我的问题可能出在UserSerializerUserViewSet

目前我还没有明确这个话题,任何方向都非常感谢。 :)

【问题讨论】:

  • 听起来 URL 模式不支持句点。你能把它使用的正则表达式包含在纯文本中吗?
  • @TankorSmash 理论上我使用的正则表达式是模型 User ... 的用户名字段中 RegexValidator( r'^[\w.@+-]+$', _('Enter a valid username. This value may contain only ' 'letters, numbers ' 'and @/./+/-/_ characters.') ), 的代码部分?抱歉,我是正则表达式的新手

标签: python regex django django-rest-framework django-users


【解决方案1】:

如果您查看错误,您会注意到它尝试匹配某个 url,但失败了。这是因为默认的正则表达式 ([^./]) 不包括 ./ 字符

您可以将lookup_value_regex 添加到您的 ViewSet 中,以便 URL 知道您的主键应该采用什么格式:

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    lookup_value_regex = '[\w.@+-]+'
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    filter_fields = ('username', 'is_player', 'first_name', 'last_name', 'team' , 'email', )

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 1970-01-01
    • 2022-10-17
    • 2013-01-15
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    相关资源
    最近更新 更多