Eu quero concatenar uma string em uma tag de modelo do Django, como:
{% extend shop/shop_name/base.html %}
Aqui shop_name
está minha variável e eu quero concatenar isso com o restante do caminho.
Suponha que eu tenha shop_name=example.com
e quero que o resultado seja estendido shop/example.com/base.html
.
django
django-templates
Ahsan
fonte
fonte
shop_name
, então é perigoso.shop_name
antes de passá-lo para o contexto em uma visualização,get_context_data
verifique se está traduzido usando emugettext
vez deugettext_lazy
.Não use
add
para strings, você deve definir uma tag personalizada como esta:Crie um arquivo:
<appname>\templatetags\<appname>_extras.py
e depois use-o como @Steven diz
Razão para evitar
add
:De acordo com os documentos
Se as duas variáveis forem inteiras, o resultado seria inesperado.
fonte
add
" sozinho apenas não usastr()
em primeiro lugar e não funcionou em tudo para mim enquanto sua solução funciona perfeitamente{% load <appname>_extras %}
Eu mudei a hierarquia de pastas
e então abaixo funcionaria.
Agora é capaz de estender a página base.html.
fonte
Consulte Concatenando strings em modelos do Django :
Para versões anteriores do Django:
{{ "Mary had a little"|stringformat:"s lamb." }}
Outro:
{{ "Mary had a little"|add:" lamb." }}
fonte
Dê uma olhada no
add
filtro .Editar: você pode encadear filtros, para poder fazer isso
"shop/"|add:shop_name|add:"/base.html"
. Mas isso não funcionará porque cabe à tag do modelo avaliar filtros nos argumentos, e a extensão não.Eu acho que você não pode fazer isso nos modelos.
fonte
Dos documentos:
Essa tag pode ser usada de duas maneiras:
{% extends "base.html" %}
(entre aspas) usa o valor literal "base.html" como o nome do modelo pai a ser estendido.{% extends variable %}
usa o valor da variável Se a variável for avaliada como uma string, o Django usará essa string como o nome do template pai. Se a variável for avaliada como um objeto Template, o Django usará esse objeto como modelo pai.Parece que você não pode usar um filtro para manipular o argumento. Na visualização de chamada, é necessário instanciar o modelo ancestral ou criar uma variável de cadeia com o caminho correto e transmiti-la ao contexto.
fonte
A resposta do @ error é fundamental, você deve usar uma tag de modelo para isso. No entanto, prefiro uma tag de modelo um pouco mais genérica que possa ser usada para executar qualquer tipo de operação semelhante a esta:
e então você pode usá-lo assim em seu modelo:
Como o comentário menciona, essa tag de modelo é particularmente útil para informações repetíveis em um modelo, mas requer lógica e outras coisas que irão influenciar seus modelos ou nos casos em que você deseja reutilizar os dados passados entre os modelos através de blocos:
e depois:
O crédito para a tag captureas é devido aqui: https://www.djangosnippets.org/snippets/545/
fonte
Eu achei que trabalhar com a
{% with %}
tag era bastante complicado. Em vez disso, criei a seguinte tag de modelo, que deve funcionar em seqüências de caracteres e números inteiros.Em seguida, carregue a tag de modelo no seu modelo na parte superior, usando o seguinte:
Você pode usá-lo da seguinte maneira:
Pessoalmente, achei isso muito mais limpo para trabalhar.
fonte
Você não pode fazer manipulação de variáveis nos modelos de django. Você tem duas opções: escreva sua própria tag de modelo ou faça isso em vista,
fonte
extends
não tem facilidade para isso. Coloque todo o caminho do modelo em uma variável de contexto e use-o ou copie a tag de modelo existente e modifique-a adequadamente.fonte
E concatenação múltipla:
E no modelo:
fonte