Чи має Python еквівалент toString (), і чи можу я перетворити елемент db.Model у String?


87

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

Дякую!

Редагувати: Ось мій клас Todo

class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)

Чи змінить мого автора на StringProperty щось негативне? Можливо, я можу взагалі відмовитись від кастингу.

Відповіді:


92

У python str()метод подібний до toString()методу в інших мовах. Це називається передача об'єкта для перетворення в рядок як параметр. Внутрішньо він викликає __str__()метод об'єкта параметра, щоб отримати його рядкове представлення.

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


Дякую за відповідь. Я отримую таку помилку при спробі str (todo.author) у шаблоні: TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'будь-які ідеї?
Амру Е.

1
Спробуйте навести лапки навколо 'str(todo.author)'так. Я не маю досвіду роботи з шаблонами Django, але, схоже, його механізм синтаксичного аналізу зависає в дужках після імені strфункції. Або ви можете скоріше отримати властивість string автора, можливо щось на зразок todo.author.nickname, без необхідності str()виклику.
Джефф Локхарт,

Я нарешті змусив це запрацювати! Я використав todo.author.nickname у своєму операторі if і перевірив, чи відповідає це значення псевдоніму поточного користувача. Будь ласка, відредагуйте свою відповідь, щоб включити її, щоб я міг її прийняти.
Амру Е.

35

У Python ми можемо використовувати __str__()метод.

Ми можемо замінити це у своєму класі так:

class User: 

    firstName = ''
    lastName = ''
    ...

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

і під час бігу

print(user)

він викличе функцію __str__(self) та надрукує ім’я та прізвище


6

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


Дякую за відповідь! Я продовжу і спробую застосувати фільтр зараз. Однак я трохи заплутаний щодо прізвиська. Я вже бавився з цим раніше, і мені вдалося маніпулювати ним, як будь-яким іншим рядком, і відправити його через значення шаблону просто чудово. Мені чогось не вистачає? О, і автор є UserProperty. Додам це до свого початкового запитання.
Амру Е.

Я не використовую шаблони django, тому не знаю, що вони будуть робити. Деякі шаблонні системи автоматично викликатимуть викликаються (псевдонім ())
Тім Хоффман,

Ви не проти коротко пояснити, що зробив би фільтр? Я не впевнений, що насправді є функцією мого todos = Todo.all ().
Амру Е.

Як видно з прикладу коду, filter - це аргумент запиту, зокрема властивість автора = деяке значення. Ви дійсно повинні витратити трохи часу на читання документів, це заощадить вам багато часу. developers.google.com/appengine/docs/python/datastore розповідає про сховище даних, а також про те, як отримати / помістити та запитати дані.
Тім Хоффман,

2

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


2

У функції post ():

todo.author = users.get_current_user()

Отже, щоб отримати str (todo.author), вам потрібен str (users.get_current_user ()). Що повертає функція get_current_user ()?

Якщо це об'єкт, перевірте, чи містить він функцію str () "?

Я думаю, що помилка полягає в цьому.


users.get_current_user () повертає об'єкт користувача, який має псевдонім (), щоб забезпечити читабельне ім'я для користувача. У мене були проблеми з правильним отримання прізвиська, але я це зрозумів. Дякую!
Амру Е.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.