web-dev-qa-db-fra.com

Django vue post-only basée sur la classe

Désolé si c'est une question banale, mais j'ai cherché un certain temps et je n'ai pas pu trouver une bonne implémentation.

Quelqu'un peut-il fournir un exemple de la façon d'implémenter une vue post-only (qui peut gérer les téléchargements de fichiers) dans Django en sous-classant l'une des vues génériques?

Je veux créer un point de terminaison qui gère toute la logique de création de commentaire de billet de blog. Le formulaire de commentaire est intégré sur ma page de blog et donc, ces données seront envoyées à l'url sous la forme POST.

17
sudshekhar

La classe View a un http_method_names attribut qui répertorie les méthodes HTTP acceptées par la vue.

Par conséquent, vous pouvez sous-classer n'importe quelle vue générique de votre choix (par exemple, CreateView ) et définir http_method_names afin que seules les demandes POST soient autorisées.

from Django.views.generic.edit import CreateView


class CommentCreateView(CreateView):
    http_method_names = ['post']
    model = Comment
    ...

Vous pouvez également sous-classer View et écrire votre propre méthode de publication.

class CommentView(View):

    def post(self, request):
        ...

Dans ce cas, les requêtes GET renverront une réponse HttpResponseNotAllowed, car vous n'avez pas défini de méthode get pour gérer les requêtes GET.

28
Alasdair

Vous pouvez essayer quelque chose comme:

class MyView(TemplateView):
    template_name = 'my_template.html'

    def post(self, request, **kwargs):
        my_data = request.POST
        # do something with your data
        context = {}  #  set your context
        return super(TemplateView, self).render_to_response(context)
5
Andreas Schosser

De la docs :

dispatch examine la demande pour déterminer s'il s'agit d'un GET, POST, etc., et relaie la demande vers une méthode de correspondance si l'une est définie , ou déclenche HttpResponseNotAllowed

Donc, essentiellement, toute vue basée sur une classe que vous créez dans laquelle vous ne définissez qu'une méthode POST, n'autorisera qu'une demande POST.

3
Sayse

Je suppose que quelque chose comme ça devrait fonctionner:

class TestView(View):

    def post(self, request):
        return HttpResponse('This is a post only view')

Vous pouvez également le faire en utilisant un CreateAPIView si vous utilisez Django Rest Framework http://www.Django-rest-framework.org/api-guide/generic-views/ #createapiview

Utilisé pour les points de terminaison de création uniquement.

Fournit un gestionnaire de méthode de publication.

0
Ankur Gupta