erro de sintaxe sempre que eu colocar o código Python dentro de um modelo de Django

votos
2

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? Estou a formatação meu código errado?

Editar: 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. Eu tenho agora:

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.

Publicado 09/11/2008 em 20:24
fonte usuário
Em outras línguas...                            


5 respostas

votos
7

Tenho a certeza de que os modelos do Django 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.

Respondeu 09/11/2008 em 20:44
fonte usuário

votos
6

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ê precisa 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 conseguir o que você estava tentando:

  • Use um motor de modelo diferente. Veja Jinja2 para um bom exemplo de que é totalmente explicada para a integração com Django.
  • Use uma tag que permite que você faça expressões Python. Veja limodou de 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.

Respondeu 10/11/2008 em 02:25
fonte usuário

votos
3

Eu não vejo por que você iria 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 lista de compreensão:

embed_list = [embed.replace("&lt;", "<") for embed in embeds]
Respondeu 09/11/2008 em 21:04
fonte usuário

votos
2

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 unescaping html com uma função de biblioteca, em vez de fazê-lo sozinho.

Esse erro NoneType soa 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.

Respondeu 09/11/2008 em 21:04
fonte usuário

votos
2

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

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

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 teria 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, no entanto.

Você nem precisa 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 melhor sintaxe 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.

Respondeu 09/11/2008 em 20:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more