Извините, если это тривиальный вопрос, но я довольно долго искал и не смог найти хорошую реализацию.

Может ли кто-нибудь предоставить пример того, как реализовать представление только для публикации (которое может обрабатывать загрузку файлов) в Django, создав подкласс любого из общих представлений?

Я хочу создать конечную точку, которая обрабатывает всю логику создания комментариев к сообщениям в блогах. Форма комментария встроена в мою страницу блога, и поэтому эти данные будут отправлены на URL-адрес как POST.

22
sudshekhar 26 Апр 2016 в 11:39

4 ответа

Лучший ответ

Класс View имеет http_method_names, в котором перечислены методы HTTP, которые принимает представление.

Следовательно, вы можете создать подкласс любого общего вида, который вам нравится (например, { {X0}}) и установите http_method_names так, чтобы разрешались только запросы POST.

from django.views.generic.edit import CreateView


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

Как вариант, вы можете создать подкласс View и написать свой собственный метод публикации.

class CommentView(View):

    def post(self, request):
        ...

В этом случае запросы GET вернут ответ HttpResponseNotAllowed, потому что вы не определили метод get для обработки запросов GET.

32
Alasdair 26 Апр 2016 в 12:41

Я думаю, что-то вроде этого должно работать:

class TestView(View):

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

Вы также можете сделать это с помощью CreateAPIView, если вы используете Django Rest Framework. http://www.django-rest-framework.org/ api-guide / generic-views / # createapiview.

Используется для конечных точек только для создания.

Предоставляет обработчик метода публикации.

2
Ankur Gupta 26 Апр 2016 в 08:55

Из документации :

dispatch проверяет запрос, чтобы определить, является ли он GET, POST и т. д., и передает запрос соответствующему методу , если он определен , или вызывает HttpResponseNotAllowed

По сути, любое созданное вами представление на основе классов, в котором вы определяете только метод POST, разрешит только POST-запрос.

3
Sayse 26 Апр 2016 в 09:02

Вы можете попробовать что-то вроде:

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)
6
Andreas Schosser 26 Апр 2016 в 08:55