Je veux autoriser à partir de mon API backend, que tout utilisateur peut être créé avec des caractères comme .
, -
, _
, ñ
entre autres caractères dans leur champ username
qui est primary_key=True,
.Django Rest Framework - Nom d'utilisateur avec ".", "-", "_" caractère
je définis mon utilisateur personnalisé (AbstractBaseUser
) de cette façon, par rapport au champ username
qui est de mon intérêt:
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'^[\[email protected]+-]+$',
_('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()
Mon UserSerializer
est la suivante:
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 ...',)
Mon UserViewSet est le suivant:
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',)
La route r est défini og cette façon dans urls.py
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
Lorsque je crée un utilisateur avec .
caractère par exemple comme bacalao.cevichica
dans te domaine username
, l'utilisateur est créé, mais quand je vais à localhost:8000/api/users/
I ce message:
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>[^/.]+)/$']
Je ne suis pas très familiarisée avec les expressions régulières, et il est possible que le RegexValidator
ne soit pas bien formé?
Aussi, il est possible que mon problème soit dans le UserSerializer
ou UserViewSet
.
Au moment où je n'ai pas résolu ce sujet, toute orientation est très appréciée. :)
Il sonne comme l'URL modèle ne supporte pas les périodes. Pouvez-vous inclure l'expression rationnelle qu'il utilise en texte clair? – TankorSmash
@TankorSmash en théorie la regex que j'utilise est la section de code de 'RegexValidator ( r '^ [\ w. @ + -] + $', _ ('Entrez un nom d'utilisateur valide Cette valeur peut ne contenir que' 'lettres, chiffres' 'et @ /./+/-/_ caractères.') ), 'dans le champ du nom d'utilisateur dans le modèle Utilisateur ...? Mes excuses, je suis débutant avec des expressions régulières – bgarcial