Просмотр класса dispatch () не находит метод? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь использовать один URL с двумя представлениями. Я нашел пример этого в официальной документации django. У меня есть что-то вроде этого:

class DetailOrderView(View):
    """Combines form and detail parts into one and in darkness binds                                                                                  
    them."""

    # import pdb; pdb.set_trace()                                                                                                                     

    def get(self, request, *args, **kwargs):
        view = DisplayDetailOrderView.as_view()                                                                                                     
        return view(self, *args, **kwargs)                                                                                                          

    def post(self, request, *args, **kwargs):
        view = FormDetailOrderView.as_view()
        return view(self, *args, **kwargs)

И в urls.py я ссылаюсь на DetailOrderView.as_view ()

Однако, когда я пытаюсь запустить это, я получаю эту ошибку:

.... lib/python3.6/site-packages/django/views/generic/base.py", line 84, in dispatch
if request.method.lower() in self.http_method_names:
AttributeError: 'DetailOrderView' object has no attribute 'method'

Что в основном означает, что dispatch(self, request, *args, **kwargs) пытается вызвать request.method.lower(), обнаруживает, что запрос не имеет атрибута method! Что странно, правда?

запрос должен быть определен в as_view() верно?

Это в значительной степени к / п из официальной документации, и оно должно работать, поэтому я должен делать что-то глупое ..

1 Ответ

0 голосов
/ 30 августа 2018

Вы правы, что сначала вам нужно использовать .as_view(), но вы вызываете view функция с self в качестве первого аргумента. Первый аргумент функции view - это запрос, поэтому:

class DetailOrderView(View):
    """Combines form and detail parts into one and in darkness binds
    them."""

    def get(self, request, *args, **kwargs):
        view = DisplayDetailOrderView.as_view()
        return <b>view(request, *args, **kwargs)</b>  # no self

    def post(self, request, *args, **kwargs):
        view = FormDetailOrderView.as_view()
        return <b>view(request, *args, **kwargs)</b>  # no self

Обратите внимание, что это все еще может пойти не так, поскольку, например, DisplayDetailOrderView имеет другие параметры URL, возможно, что это представление не сможет правильно обрабатывать данные.

Хотя вызов другого представления технически возможен 1012 *, это не очень распространено.

...