onde fazer funções que não são exibidos ir no Django
-
23-08-2019 - |
Pergunta
Eu tenho alguns links em uma página HTML como, atualmente eu tratá-los como tão
<p> <a href="/cases/{{case.id}}/case_rate/-">rate down</a>
e tem uma entrada url.py:
(r'^cases/(?P<case_id>\d+)/case_rate/(?P<oper>.)$', 'mysite.cases.views.case_rate'),
então eu tenho uma função de visualização que lida com a lógica e atinge o DB, em seguida, faz isso:
return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))
I está lá uma maneira melhor de fazer isso? Eu posso ver como isso seria OK porque tem de redesenhar a tela para mostrar a nova classificação ...
Solução
A forma habitual de lidar com isso é com um pedido de AJAX.
Em vez de um link, você colocar um manipulador de javascript que chama um ponto de vista, wich atualiza o db, e retorna um json / xml objeto com a nova classificação para o item. Em seguida, outro identificador javascript recebe essa resposta e atualiza o número de classificação na tela, sem recarregar a página.
O ideal é que você vai manter ambas as versões: html simples (o que você tem atualmente) eo ajax. A única ajax pode ser anexar ao elemento após o carregamento da página, por isso, se javascript não estiver disponível, você ainda vai ter um local de trabalho.
Em seguida, sobre a organização, você pode ter um parâmetro "ajax" na sua visão. A visão deve atualizar o db em conformidade, e se é uma chamada de ajax, retornar a resposta json / xml, caso contrário, volte a nova página. Dessa forma, você pode manter a lógica (buscar o objeto, atualizar o db) em um só lugar.
Outras dicas
Se você está perguntando se case_rate ainda deve ir na views.py dado que ele retorna um redirecionamento em vez de fornecer conteúdo, a resposta é sim, desde case_rate está a lidar com um pedido e retornar uma resposta.
Mas considere uma situação onde você tinha duas funções vista em views.py que tiveram algum código duplicado, e você escolheu fator que código duplicado em outra função que não fez tanto pedido take e retornar uma resposta. Oxalá jogo justo seja para deixar em views.py? Claro, se movendo em outro lugar faria o código mais difícil de ler. Ou você pode optar por colocá-lo em outro lugar. É realmente a sua chamada com base no seu sentido do paladar.