Estou escrevendo um aplicativo de lista de tarefas para me ajudar a começar a usar o Python. O aplicativo está sendo executado no GAE e estou armazenando itens de tarefas no armazenamento de dados. Eu quero exibir os itens de todos para eles, e apenas eles. O problema é que o aplicativo atualmente exibe todos os itens para todos os usuários, então eu posso ver o que você escreve e você vê o que escrevo. Achei que lançar meu objeto todo.author em uma string e ver se ele corresponde ao nome do usuário seria um bom começo, mas não consigo descobrir como fazer isso.
Isso é o que tenho em meu main.py
...
user = users.get_current_user()
if user:
nickname = user.nickname()
todos = Todo.all()
template_values = {'nickname':nickname, 'todos':todos}
...
def post(self):
todo = Todo()
todo.author = users.get_current_user()
todo.item = self.request.get("item")
todo.completed = False
todo.put()
self.redirect('/')
No meu index.html eu tinha originalmente:
<input type="text" name="item" class="form-prop" placeholder="What needs to be done?" required/>
...
<ul>
{% for todo in todos %}
<input type="checkbox"> {{todo.item}} <hr />
{% endfor %}
</ul>
mas gostaria de exibir os itens apenas para o usuário que os criou. Pensei em tentar
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr />
{% endifequal %}
{% endfor %}
sem sucesso. A lista fica em branco. Presumi que fosse porque todo.author não é uma string. Posso ler o valor como uma string ou posso converter o objeto em String?
Obrigado!
Editar: aqui está minha classe de tarefas
class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
Mudar meu autor para StringProperty afetará negativamente? Talvez eu possa renunciar totalmente ao elenco.
fonte
TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'
alguma ideia?'str(todo.author)'
assim. Não tenho experiência com modelos Django, mas parece que seu mecanismo de análise está travando entre parênteses após ostr
nome da função. Ou você pode preferir obter a propriedade string do autor, possivelmente algo comotodo.author.nickname
, sem a necessidade dastr()
chamada.Em Python, podemos usar o
__str__()
método.Podemos substituí-lo em nossa classe assim:
class User: firstName = '' lastName = '' ... def __str__(self): return self.firstName + " " + self.lastName
e ao correr
ele irá chamar a função
__str__(self)
e imprimir o firstName e o lastNamefonte
str()
é o equivalente.No entanto, você deve filtrar sua consulta. No momento, sua consulta é da
all()
Todo.todos = Todo.all().filter('author = ', users.get_current_user().nickname())
ou
todos = Todo.all().filter('author = ', users.get_current_user())
dependendo de como você está definindo o autor no modelo Todo. A
StringProperty
ouUserProperty
.Nota
nickname
é um método. Você está passando o método e não o resultado nos valores do modelo.fonte
Você deve definir o
__unicode__
método em seu modelo, e o modelo o chamará automaticamente quando você fizer referência à instância.fonte
Na função post ():
Portanto, para obter str (todo.author), você precisa de str (users.get_current_user ()). O que é retornado pela função get_current_user ()?
Se for um objeto, verifique se ele contém uma função str () "?
Acho que o erro está aí.
fonte