django.urls.exceptions.NoReverseMatch: 'user' is not a registered namespace

Question:

I am trying to create a Log in and Registration for a Django Rest Framework but I keep getting django.urls.exceptions.NoReverseMatch: 'user' is not a registered namespace not sure what is the reason for getting this error and how to fix it?

Here is the serializers.py:

class UserSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = ["id", "first_name", "last_name", "username"]

class RegisterSerializer(serializers.ModelSerializer):
  email = serializers.EmailField(
    required=True,
    validators=[UniqueValidator(queryset=User.objects.all())]
  )
  password = serializers.CharField(
    write_only=True, required=True, validators=[validate_password])
  password2 = serializers.CharField(write_only=True, required=True)
  class Meta:
    model = User
    fields = ('username', 'password', 'password2',
         'email', 'first_name', 'last_name')
    extra_kwargs = {
      'first_name': {'required': True},
      'last_name': {'required': True}
    }
  def validate(self, attrs):
    if attrs['password'] != attrs['password2']:
      raise serializers.ValidationError(
        {"password": "Password fields didn't match."})
    return attrs
  def create(self, validated_data):
    user = User.objects.create(
      username=validated_data['username'],
      email=validated_data['email'],
      first_name=validated_data['first_name'],
      last_name=validated_data['last_name']
    )
    user.set_password(validated_data['password'])
    user.save()
    return user

Here is the views.py:

class UserDetailAPI(APIView):
  authentication_classes = (TokenAuthentication,)
  permission_classes = (AllowAny,)
  def get(self,request,*args,**kwargs):
    user = User.objects.get(id=request.user.id)
    serializer = UserSerializer(user)
    return Response(serializer.data)

class RegisterUserAPIView(generics.CreateAPIView):
  permission_classes = (AllowAny,)
  serializer_class = RegisterSerializer

Here is the urls.py

    path('get-details/', UserDetailAPI.as_view()),
    path('register', RegisterUserAPIView.as_view()),

Here is the traceback:

Traceback (most recent call last):
  File "C:UsersUserDesktopProjectvenvlibsite-packagesdjangocorehandlersexception.py", line 55, in inne
r
    response = get_response(request)
  File "C:UsersUserDesktopProjectvenvlibsite-packagesdjangocorehandlersbase.py", line 197, in _get_res
ponse
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:UsersUserDesktopProjectvenvlibsite-packagesdjangoviewsgenericbase.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:UsersUserDesktopProjectvenvlibsite-packagesdjangocontribauthmixins.py", line 72, in dispatch

    return self.handle_no_permission()
  File "C:UsersUserDesktopProjectvenvlibsite-packagesdjangocontribauthmixins.py", line 51, in handle_n
o_permission
    resolved_login_url = resolve_url(self.get_login_url())
  File "C:UsersUserDesktopProjectvenvlibsite-packagesdjangoshortcuts.py", line 145, in resolve_url
    return reverse(to, args=args, kwargs=kwargs)
  File "C:UsersUserDesktopProjectvenvlibsite-packagesdjangourlsbase.py", line 82, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'user' is not a registered namespace
Asked By: A_K

||

Answers:

Make sure that you defined the app_name="user" just above the url patterns in urls.py to be the registered namespace.

urls.py:

app_name='user'

urlpatterns=[
    #...
    #...
    path('get-details/', UserDetailAPI.as_view()),
    path('register/', RegisterUserAPIView.as_view()),
    #...
    #...
]

Note: Always add / at the end of every route or path.

Answered By: Sunderam Dubey

Somewhere you are trying to call some view of the user by redirecting or reversing the view name like "user:register" or something like that, you should give a name to your urlpatterns of your user app:

app_name = "user"

urlpatterns = [
  path('url-name', view_name, name='name')
]

and in your core urlpatterns give a namespace for your user application:

urlpatterns = [
  ...
  path('user/', include('user.urls', namespace='user'))
]

Now you can call any of your view with reversing by user application’s view name like reverse('user:register'), or in a template {% url 'user:register' %}.

Answered By: Ubaydullo Ibrohimov