куда идут функции, которые не отображаются в django
-
23-08-2019 - |
Вопрос
У меня есть несколько ссылок на html-странице, например , , , в настоящее время я обрабатываю их следующим образом
<p> <a href="/cases/{{case.id}}/case_rate/-">rate down</a>
и получите url.py запись:
(r'^cases/(?P<case_id>\d+)/case_rate/(?P<oper>.)$', 'mysite.cases.views.case_rate'),
затем у меня есть функция просмотра, которая обрабатывает логику и обращается к базе данных, затем выполняет это:
return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))
I есть ли лучший способ сделать это?Я вижу, что это было бы нормально, потому что для отображения нового рейтинга действительно нужно перерисовать экран...
Решение
Типичный способ справиться с этим - с помощью ajax-запроса.
Вместо ссылки вы помещаете обработчик javascript, который вызывает представление, которое обновляет базу данных и возвращает объект json / xml с новым рейтингом для элемента.Затем другой дескриптор javascript получает этот ответ и обновляет номер рейтинга на экране без перезагрузки страницы.
В идеале вы должны сохранить обе версии:обычный html (тот, который у вас есть в данный момент) и ajax-код.ajax-файл может быть присоединен к элементу после загрузки страницы, поэтому, если javascript недоступен, у вас все равно будет работающий сайт.
Затем, что касается организации, у вас может быть параметр "ajax" в вашем представлении.Представление должно соответствующим образом обновить базу данных, и если это вызов ajax, верните ответ json / xml, в противном случае верните новую страницу.Таким образом, вы можете сохранить логику (извлечение объекта, обновление базы данных) в одном месте.
Другие советы
Если вы спрашиваете, следует ли по-прежнему указывать case_rate в views.py учитывая, что он возвращает перенаправление, а не предоставляет контент, ответ - да, поскольку case_rate обрабатывает запрос и возвращает ответ.
Но рассмотрим ситуацию, когда у вас были две функции просмотра в views.py, в которых был некоторый дублированный код, и вы решили включить этот дублированный код в другую функцию, которая не принимала запрос и не возвращала ответ.Будет ли это честной игрой, чтобы уйти в views.py?Конечно, если бы перемещение его в другое место затруднило чтение кода.Или вы могли бы поместить его в другое место.Это действительно ваше решение, основанное на вашем чувстве вкуса.