web-dev-qa-db-fra.com

Impossible d'appliquer DjangoModelPermissions sur une vue qui ne possède pas la propriété `.queryset` ni ne remplace la méthode` .get_queryset () `

Je reçois le message d'erreur ".accepted_renderer non défini sur Response resp api Django".

Je suis le tutoriel Django rest-api. Version Django que j'utilise 1.8.3 J'ai suivi le tutoriel jusqu'à la première partie. Cela a fonctionné correctement. Mais quand j'ai continué la 2e partie en envoyant la réponse, j'ai eu une erreur 

Cannot apply DjangoModelPermissions on a view that does not have `.queryset` property or overrides the `.get_queryset()` method.

Puis j'ai essayé d'autres moyens que j'ai 

.accepted_renderer not set on Response resp api Django

Sil te plait aide moi. Je pense que son problème de permission.

44
Gaurav

Vous avez probablement défini DjangoModelPermissions comme classe d'autorisation par défaut dans vos paramètres. Quelque chose comme:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    )
}

DjangoModelPermissions ne peut être appliqué qu'aux vues ayant une propriété .queryset ou une méthode .get_queryset()

Étant donné que le didacticiel 2 utilise des FBV, vous devrez probablement le convertir en CBV ou spécifier une classe d’autorisations différente pour cette vue . Vous devez utiliser le décorateur api_view dans votre vue. Vous pouvez ensuite définir permissions comme ci-dessous:

from rest_framework.decorators import api_view, permission_classes
from rest_framework import permissions

@api_view([..])
@permission_classes((permissions.AllowAny,))
def my_view(request)
    ...

Pour résoudre l'erreur de rendu, vous devez ajouter le rendu correspondant à vos paramètres.

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.<corresponding_renderer>',
        ...
    )
}
69
Rahul Gupta

Je l’ai fonctionné d’une autre manière . Mon utilisateur connecté était le superutilisateur que j’ai créé. Donc, j’ai créé un autre utilisateur à partir de l’administrateur et lui ai assigné toutes les autorisations. Puis connecté à l'administrateur par cet utilisateur.

Dans le fichier settings.py, j'ai changé de code.

REST_FRAMEWORK = {
    # Use Django's standard `Django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

Et ça a fonctionné.

14
Gaurav

La solution pour moi a été soulignée par @ProfNandaa ci-dessus

Solution rapide, commentez le La ligne 'rest_framework.renders.DjangoModelPermissions' pour l'instant - si vous suivent le didacticiel DRF 2; et peut-être avez-vous ajouté cela dans settings.py lors de l’exemple de la page d’accueil.

J'avais en effet ajouté ceci à partir de l'exemple de la page d'accueil avant de m'engager dans le tutoriel et de viser le même problème.

Quand j'ai commenté le code incriminé

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    )
}

de settings.py tout a bien fonctionné à nouveau.

4
Arctic Giraffe

Il y a beaucoup de bonnes solutions déjà énumérées ici. J'ai également rencontré le même problème dans le deuxième tutoriel. Il montrait:

Impossible d'appliquer DjangoModelPermissionsOrAnonReadOnly sur une vue qui le fait pas défini .queryset ou avoir une méthode .get_queryset().

J'ai changé le settings.py pour exclure DEFAULT_PERMISSION_CLASSES comme ci-dessous:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
    ]
}

Ensuite, il fonctionne avec succès. J'ai essayé avant d'avoir trouvé ces réponses.

1
arsho

Dans mon cas, (pour le tutoriel 2, djangorestframework ver 3.7.7), cela fonctionne lorsque je modifie les paramètres pour:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}
0
CK.Nguyen