Как вы можете отправить метод запроса в 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),
Ответы
Ответ 1
Причина, по которой это делается как единственный метод просмотра, заключается в том, что вы обычно показываете какой-то контент страницы как контекст для формы, которую вы собираетесь отправить.
Во всяком случае, моя причина ответить на это: из вашего примера URLConf там похоже, что вы создаете веб-сервис REST с помощью Django - если это так, вам может быть полезно воспользоваться довольно хорошим django-piston для автоматического создания ваших ресурсов/коллекций. Он использует обработчики на основе классов, которые автоматически перенаправляют на соответствующий метод (книги, книги-обновления, книги-создатели в вашем случае) на основе метода HTTP в запросе
UPDATE (четыре года спустя!), в то время как django-piston все еще существует (и работает), Django REST Framework является гораздо более сложным, документированный и расширенный выбор в эти дни.
Ответ 2
В стандартном Django нет механизма дифференцирования методов запроса, кроме того, что вы использовали во втором фрагменте:
if request.method == 'POST':
...
Тем не менее, есть сторонние приложения и фрагменты, которые пытаются сделать метод обработки немного чище, используя представления, основанные на классе. См., Например, этот фрагмент (найденный из этот SO-вопрос о представлениях класса).
Лично я не уверен, что это хорошая идея. Стандартный метод Django является настолько... стандартным... что я думаю, что это вводит дополнительную путаницу и сложность там, где это действительно не нужно.