Я пишу приложение со списком ToDo, чтобы помочь себе начать работу с Python. Приложение работает в GAE, и я храню задачи в хранилище данных. Я хочу показать им все, и только им. Проблема в том, что приложение в настоящее время отображает все элементы для всех пользователей, поэтому я могу видеть, что вы пишете, и вы видите, что пишу я. Я думал, что приведение моего объекта 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? Может, вообще откажусь от кастинга.
TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'
какие-нибудь идеи?'str(todo.author)'
. У меня нет опыта работы с шаблонами Django, но похоже, что его механизм синтаксического анализа зависает от скобок после имениstr
функции. Или вы можете получить строковое свойство автора, возможно, что-то вроде этогоtodo.author.nickname
, без необходимостиstr()
вызова.В Python мы можем использовать
__str__()
метод.Мы можем переопределить это в нашем классе следующим образом:
class User: firstName = '' lastName = '' ... def __str__(self): return self.firstName + " " + self.lastName
и при беге
он вызовет функцию
__str__(self)
и напечатает firstName и lastNameисточник
str()
эквивалент.Однако вы должны фильтровать свой запрос. На данный момент ваш запрос принадлежит
all()
Todo.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 ():
Итак, чтобы получить str (todo.author), вам понадобится str (users.get_current_user ()). Что возвращает функция get_current_user ()?
Если это объект, проверьте, содержит ли он функцию str () "?
Я думаю, что ошибка в этом.
источник