2017-03-16 3 views
1

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>[^/.]+)/$'] 

enter image description here

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. :)

+1

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

+0

@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

Répondre

2

Si vous regardez l'erreur, vous remarquerez qu'elle a tenté de faire correspondre à une URL, mais a échoué. En effet, le défaut regex ([^./]) exclut . et / caractères

Vous pouvez ajouter un lookup_value_regex à votre ViewSet afin que l'URL sait ce formatez votre clé primaire devrait être:

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