Pergunta

Eu estou tentando fazer o seguinte no meu modelo Django:

    {% for embed in embeds %}
           {% embed2 = embed.replace("&lt;", "<") %}
           {{embed2}}<br />
    {% endfor %}

No entanto, eu sempre chegar um bloco inválido ou algum erro de sintaxe quando eu faço qualquer coisa assim (com isso quero dizer {%%} código dentro de um loop). Python não tem {} para significar "escopo" então eu acho que isso pode ser o meu problema? Am I formatar meu erro código?

Edit: o erro exato é: Invalid block tag: 'embed2'

Edit2: Como alguém disse o que estou fazendo não é suportado por modelos de Django, eu reescrevi o código, colocando a lógica na vista. Agora tenho:

embed_list = []
for embed in embeds:
    embed_list[len(embed_list):] = [embed.replace("&lt;", "<")] #this is line 35
return render_to_response("scanvideos.html", {
    "embed_list" :embed_list
})

No entanto, agora eu recebo um erro:. 'NoneType' object is not callable" on line 35

Foi útil?

Solução

Em vez de usar uma atribuição fatia crescer uma lista

embed_list[len(embed_list):] = [foo]

você provavelmente deve apenas fazer

embed_list.append(foo)

Mas realmente você deve tentar html unescaping com uma função de biblioteca, em vez de fazê-lo sozinho.

Isso soa erro NoneType como embed.replace é Nenhuma, em algum momento, que só faz sentido se a sua lista não é uma lista de strings -. Você pode querer verificar novamente que, com alguma afirma ou algo similar

Outras dicas

Estou bastante certo de que Django templates não suporta isso. Para sua operação de substituição Gostaria de olhar para diferentes filtros.

Você realmente deve tentar manter tanto lógica como você pode em seus pontos de vista e não nos modelos.

linguagem de templates do Django é deliberadamente prejudicado. Quando usado por designers não-programação, esta é definitivamente uma coisa boa, mas há momentos em que você necessidade para fazer um pouco de programação. (Não, eu não quero discutir sobre isso. Este surgiu várias vezes na django-users e django-dev.)

Duas maneiras de realizar o que você estava tentando:

  • Use um motor de modelo diferente. Consulte Jinja2 para um bom exemplo de que é totalmente explicada para a integração com Django.
  • Use a tag modelo que permite que você faça expressões Python. Consulte de limodou tag Expr .

Eu tenho usado o tag expr em vários lugares e tornou a vida muito mais fácil. Meu próximo local grande Django usará Jinja2.

Eu não vejo por que você deseja obter "objeto NoneType não é exigível". Isso deve significar que em algum lugar na linha é uma expressão como "foo (...)", e isso significa que foo é Nenhum.

BTW: Você está tentando estender o embed_list, e é mais fácil de fazê-lo como este:

embed_list = []
for embed in embeds:
    embed_list.append(embed.replace("&lt;", "<")) #this is line 35
return render_to_response("scanvideos.html", {"embed_list":embed_list})

e ainda mais fácil de usar uma compreensão da lista:

embed_list = [embed.replace("&lt;", "<") for embed in embeds]

templates Django usar sua própria sintaxe, não como Kid ou Genshi .

Você tem que rolar o seu próprio modelo personalizado Tag .

Eu acho que a razão principal é fazer cumprir as boas práticas. No meu caso, eu já tenho dificuldade em explicar esses modelos tags especiais para o designer em nossa equipe. Se fosse simples Python eu tenho certeza que não teríamos escolhido Django em tudo. Eu acho que há também um problema de desempenho, Django templates benchmarks são rápidos, enquanto última vez que verifiquei Genshi foi muito mais lento. Eu não sei se é devido à Python incorporado livremente, apesar de tudo.

Você quer necessidade de rever a sua abordagem e escrever seus próprios modelos personalizados (mais ou menos sinônimos para "ajudantes" em Ruby on Rails), ou tente outro modelo de motor.

Para a sua edição, há uma sintaxe melhor em Python:

embed_list.append(embed.replace("&lt;", "<"))

Eu não sei se ele vai corrigir o seu erro, mas pelo menos é menos JavaScriptesque; -)

Edit 2: Django escapa automaticamente todas as variáveis. Você pode aplicar HTML puro com | filtro segura:. {{embed|safe}}

É melhor levar algum tempo lendo a documentação, que é realmente grande e útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top