Django: Como eu redireciono para a página onde o formulário é originado

No meu aplicativo Django, eu tenho várias páginas exibindo um link que carrega uma nova página exibindo um formulário. Quando o formulário é enviado, qual é a maneira mais limpa de redirect para a página de origem a partir da qual esse formulário foi acessado?

página de origem -> página de formulário -> página de origem

Usando uma próxima variável parece deselegante desde que eu tenho que defini-lo como uma variável GET no link de página de origem e, em seguida, defini-lo como uma variável POST oculta no meu formulário? Quaisquer outras ideias seriam apreciadas.

Há um par de opções, todas com os contras e os benefícios do curso.

  1. passando a página de origem com POST / GET
  2. armazenando a página de origem na session (não funciona com várias abas obviamente)
  3. armazenar a página de origem em um cookie (não funciona com várias guias)
  4. se for uma única página, redirecione para o referenciador. Não parece possível no seu caso

Pessoalmente, eu acho que usar um próximo parâmetro é sua melhor opção, mas lembre-se de protegê-lo (apenas URLs relativos, sem material de javascript, framework csrf) para que você não tenha nenhum problema de segurança com ele.

O WoLpH já listou as possibilidades razoáveis e apontou (provavelmente) o melhor delas como uma solução. Então eu só vou elaborar sobre isso.

Se você precisa lidar com isso: página de origem -> página de formulário -> página de origem, então, na realidade, ficará assim: página de origem – [GET] -> página de formulário – [POST / submisão] -> página de formulário (2) – [GET / redirect] -> página de origem . Isso significa que o estágio page (2) de formulário deve saber de alguma forma onde redirect o usuário e as únicas opções razoáveis ​​que você tem aqui é usar session (com a desvantagem mencionada pelo WoLpH ) ou passá-lo no POST, possivelmente como um campo oculto .

Em relação ao primeiro GET e passando o next URL para a página de formulário , você pode passá-lo na string de consulta (que você considera deselegante) ou extraí-lo do header HTTP_REFERER – o que não funcionará para usuários mais paranoicos como eu.

Você também pode fazer um material misto aqui, ou seja, adicionar next= na string de consulta se, e somente se, o usuário não tiver desativado HTTP_REFERER em seu navegador. Então, a maioria dos usuários não verá nenhum material feio nos URLs.

Note que tudo isso pode ser automatizado, ou seja, você pode escrever seus links como:

  

Quando inject_next_url injeta sth como: next={{ context['request'].get_full_path() }} somente se HTTP_REFERER não estiver presente.

Em seguida, no manipulador de formulários, você pode usar uma function genérica extract_next_url(request) , que procura a next URL em uma das seguintes: string de consulta, HTTP_REFERER, request.POST ou mais consise – em um dos seguintes: HTTP_REFERER, request.REQUEST

Outra opção pode ser criar conf de URL separado que resolva para a mesma exibição e passar a exibição de origem como um kwargs para a exibição.