Ответ 1
В этом случае, однако, вы сравниваете автора UserProperty
от базы данных, которая имеет тип users.User
с псевдонимом строка. Вы захотите сравнить свойство nickname
автора вместо todo.author.nickname
в шаблоне.
Я пишу приложение списка ToDo, чтобы помочь мне начать работу с Python. Приложение работает на GAE, и я храню объекты todo в хранилище данных. Я хочу отображать все элементы для них, и только они. Проблема в том, что приложение в настоящее время отображает все элементы для всех пользователей, поэтому я могу видеть, что вы пишете, и вы видите, что я пишу. Я думал, что отличать объект todo.author до строки и видеть, совпадает ли она с именем пользователя, было бы хорошим началом, но я не могу понять, как это сделать.
Это то, что у меня есть в моей 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('/')
В моем index.html у меня было это первоначально:
<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>
но я хотел бы отображать элементы только для пользователя, который их создал. Я думал о попытке
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr />
{% endifequal %}
{% endfor %}
безрезультатно. Список становится пустым. Я предположил, что это потому, что todo.author не является строкой. Могу ли я прочитать значение в виде строки или я могу передать объект в String?
Спасибо!
Изменить: Вот мой класс Todo
class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
Изменит ли мой автор на эффект StringProperty что-нибудь отрицательное? Может быть, я могу отказаться от кастования вообще.
В этом случае, однако, вы сравниваете автора UserProperty
от базы данных, которая имеет тип users.User
с псевдонимом строка. Вы захотите сравнить свойство nickname
автора вместо todo.author.nickname
в шаблоне.
str()
является эквивалентным.
Однако вы должны фильтровать свой запрос. На данный момент ваш запрос all()
Todo's.
todos = Todo.all().filter('author = ', users.get_current_user().nickname())
или
todos = Todo.all().filter('author = ', users.get_current_user())
в зависимости от того, что вы определяете автора, как в модели Todo. A StringProperty
или UserProperty
.
Примечание nickname
- это метод. Вы передаете метод, а не результат в значениях шаблона.
Вы должны определить метод __unicode__
на вашей модели, и шаблон будет вызывать его автоматически, когда вы ссылаетесь на экземпляр.
В функции post():
todo.author = users.get_current_user()
Итак, чтобы получить str (todo.author), вам понадобится str (users.get_current_user()). Что возвращается функцией get_current_user()?
Если это объект, проверьте, содержит ли он функцию str()?
Я думаю, что там лежит ошибка.
в Python мы можем использовать __str __() methon.
Мы можем перегрузить его в нашем классе следующим образом:
class User :
firstName=''
lastName=''
...
def __str__(self):
return self.firstName +" "+self.lastName
и когда делают
print(user)
он напечатает затем firstName и lastName