2016-04-26 7 views
4

Entschuldigung, wenn das eine triviale Frage ist, aber ich habe seit einiger Zeit herum gesucht und konnte keine gute Implementierung finden.Django-Klasse-basierte Post-Only-Ansicht

Kann jemand ein Beispiel für die Implementierung einer Post-Only-Ansicht (die Datei-Uploads verarbeiten kann) in Django bereitstellen, indem Sie eine Unterklasse der generischen Ansichten erstellen?

Ich möchte einen Endpunkt erstellen, der alle Blog Post Kommentar Erstellungslogik behandelt. Das Kommentarformular ist in meine Blog-Seite eingebettet und somit werden diese Daten an die URL als POST gesendet.

+2

Können Sie bitte erklären, warum der Downvote? Es gibt keine solche Frage/Blog-Post zur Verfügung meines Wissens – sudshekhar

Antwort

11

Die Klasse View verfügt über ein http_method_names-Attribut, das die HTTP-Methoden auflistet, die von der Ansicht akzeptiert werden.

Daher können Sie jede generische Ansicht, die Ihnen gefällt (z. B. CreateView), von Unterklasse trennen und http_method_names so festlegen, dass nur POST-Anforderungen zulässig sind.

from django.views.generic.edit import CreateView 


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

Alternativ können Sie View, Unterklasse und Ihre eigene Post-Methode schreiben.

class CommentView(View): 

    def post(self, request): 
     ... 

In diesem Fall wird ein HttpResponseNotAllowed Antwort kehrt GET-Anfragen, weil Sie nicht GET-Anforderungen definiert haben eine get Methode zu behandeln.

0

Ich denke, so etwas wie dies funktionieren sollte:

class TestView(View): 

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

Sie können dies auch tun, indem Sie einen CreateAPIView verwenden, wenn Sie Django Rastrahmen http://www.django-rest-framework.org/api-guide/generic-views/#createapiview

Verwendet für create-nur-Endpunkte verwenden.

Stellt einen Post-Methoden-Handler zur Verfügung.

+1

Dies geht davon aus, dass DRF verwendet wird – Sayse

+1

Ich rate es muss Möglichkeiten, dies selbst zu tun. Ich benutze normale Ansichten für alles. Die Verwendung von DRF für eine bestimmte Ansicht scheint ein Overkill zu sein. – sudshekhar

+0

@Sayse Ja, es wurde angenommen, dass DRF verwendet wird. Ich habe die Antwort bearbeitet –

3

Sie könnten versuchen, so etwas wie:

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) 
+0

Ich habe es verwendet, um Formsets in einer Tabelle mit Massenfunktionen (löschen, Archivieren) zu vermeiden. Viel einfacher und sauberer. –

2

Vom docs:

Versand auf Wunsch schaut, um zu bestimmen, ob es sich um eine GET, POST, etc. und leitet die Anfrage zu einer übereinstimmenden Methode wenn eine definiert ist, oder wirft HttpResponseNotAllowed

Im Grunde erstellt jede klassenbasierte Ansicht, in der Sie nur eine POST-Methode definieren, nur eine POST-Anfrage.