Pergunta

Recentemente eu visto uma questão muito preocupante.

Eu tenho o seguinte código Python:

for cat in cats:
  cat.pages = ['apple', 'table', 'computer']

template_values = {
  'cats': cats
}

path = os.path.join(os.path.dirname(__file__), 'templates/index.html')
self.response.out.write(template.render(path, template_values))

Os index.html modelo de Django esta aparência:

{% for cat in cats %}
   <div>{{ forloop.counter }}</div>
   <div>name: {{ cat.cat_name }}</div>
   <div>pages: {{ cat.pages|length }}<br>
{% endfor %}

Quando eu estou correndo o código acima localmente com o GAE SDK, eu tenho os resultados seguinte exemplo:

1.
name: sample1
pages: 3

2.
name: sample2
pages: 3

etc. Eu posso até mesmo construir um loop aninhado desde que eu posso acessar cat.pages dentro do loop. No entanto, quando eu carregar este código para o AppEngine, eu vou pegar os seguintes resultados:

1.
name: sample1
pages: 0

2.
name: sample2
pages: 0

E eu posso nem mesmo acessar a variável cat.pages em tudo. O que há de errado com o meu código? Ou isso é um bug? Ele funciona localmente, como é esperado, mas produz este resultado estranho após a implantação de servidores do GAE. Qualquer ajuda é apreciada.

Foi útil?

Solução

Talvez tente:

for cat in cats:
   for item in ['apple', 'table', 'computer']:
       cat.pages.append(item)

Se cat.pages é algo desagradável em GAE como uma lista instrumentada, seu código original teria substituí-lo atacado com uma lista python run-of-the-mill.

Outras dicas

Eu acho que nós vamos precisar de mais contexto para ver qual é o problema aqui. Onde é que 'gatos' vem, e quais são os objetos gato individuais? Eu estou supondo que eles são instâncias de modelo, mas é difícil dizer com base no seu exemplo. Será que funciona se você substituí-los com uma variedade de subclasses objeto simples? Isso iria mostrar-lhe se é algo específico para a classe que você está usando.

Em geral, porém, é uma má idéia para atribuir propriedades arbitrárias de seus objetos para templates conveniência. Você seria melhor criar um objeto de recipiente, ou dicionário.

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