Подтвердить что ты не робот

Имеет ли Python эквивалент toString() и может ли я преобразовать элемент db.Model в String?

Я пишу приложение списка 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 что-нибудь отрицательное? Может быть, я могу отказаться от кастования вообще.

4b9b3361

Ответ 1

В python метод str() аналогичен методу toString() на других языках. Он называется передачей объекта для преобразования в строку в качестве параметра. Внутри он вызывает метод __str__() объекта параметра, чтобы получить его строковое представление.

В этом случае, однако, вы сравниваете автора UserProperty от базы данных, которая имеет тип users.User с псевдонимом строка. Вы захотите сравнить свойство nickname автора вместо todo.author.nickname в шаблоне.

Ответ 2

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 - это метод. Вы передаете метод, а не результат в значениях шаблона.

Ответ 3

Вы должны определить метод __unicode__ на вашей модели, и шаблон будет вызывать его автоматически, когда вы ссылаетесь на экземпляр.

Ответ 4

В функции post():

todo.author = users.get_current_user()

Итак, чтобы получить str (todo.author), вам понадобится str (users.get_current_user()). Что возвращается функцией get_current_user()?

Если это объект, проверьте, содержит ли он функцию str()?

Я думаю, что там лежит ошибка.

Ответ 5

в Python мы можем использовать __str __() methon.

Мы можем перегрузить его в нашем классе следующим образом:

    class User : 

    firstName=''
    lastName=''
    ...

    def __str__(self):
        return self.firstName +" "+self.lastName

и когда делают

print(user)

он напечатает затем firstName и lastName