Подтвердить что ты не робот

Как вы можете отправить метод запроса в Django URLpatterns?

Это ясно, как создать URLPattern, который отправляет URL-адрес регулярного выражения:

(r'^books/$', books),

где книги могут дополнительно отправить запрос по запросу:

def books(request):
    if request.method == 'POST':
        ...
    else:
        ...

Я хотел бы знать, есть ли идиоматический способ включить метод запроса внутри URL-адреса, сохраняя всю информацию о доставке/маршруте в одном месте, например:

(r'^books/$', GET, retrieve-book),
(r'^books/$', POST, update-books),
(r'^books/$', PUT, create-books),
4b9b3361

Ответ 1

Причина, по которой это делается как единственный метод просмотра, заключается в том, что вы обычно показываете какой-то контент страницы как контекст для формы, которую вы собираетесь отправить.

Во всяком случае, моя причина ответить на это: из вашего примера URLConf там похоже, что вы создаете веб-сервис REST с помощью Django - если это так, вам может быть полезно воспользоваться довольно хорошим django-piston для автоматического создания ваших ресурсов/коллекций. Он использует обработчики на основе классов, которые автоматически перенаправляют на соответствующий метод (книги, книги-обновления, книги-создатели в вашем случае) на основе метода HTTP в запросе

UPDATE (четыре года спустя!), в то время как django-piston все еще существует (и работает), Django REST Framework является гораздо более сложным, документированный и расширенный выбор в эти дни.

Ответ 2

В стандартном Django нет механизма дифференцирования методов запроса, кроме того, что вы использовали во втором фрагменте:

if request.method == 'POST':
    ...

Тем не менее, есть сторонние приложения и фрагменты, которые пытаются сделать метод обработки немного чище, используя представления, основанные на классе. См., Например, этот фрагмент (найденный из этот SO-вопрос о представлениях класса).

Лично я не уверен, что это хорошая идея. Стандартный метод Django является настолько... стандартным... что я думаю, что это вводит дополнительную путаницу и сложность там, где это действительно не нужно.