Piszę aplikację z listą zadań do zrobienia, aby pomóc sobie w rozpoczęciu pracy z Pythonem. Aplikacja działa w GAE i przechowuję elementy do wykonania w magazynie danych. Chcę pokazać im wszystkie przedmioty i tylko jemu. Problem w tym, że aplikacja wyświetla obecnie wszystkie pozycje wszystkim użytkownikom, więc ja widzę, co piszesz, a ty widzisz, co piszę. Pomyślałem, że rzutowanie obiektu todo.author na łańcuch i sprawdzenie, czy pasuje do nazwy użytkownika, byłoby dobrym początkiem, ale nie wiem, jak to zrobić.
To jest to, co mam w moim 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('/')
W moim index.html miałem to pierwotnie:
<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>
ale chciałbym wyświetlać elementy tylko użytkownikowi, który je utworzył. Myślałem, żeby spróbować
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr />
{% endifequal %}
{% endfor %}
bezskutecznie. Lista jest pusta. Założyłem, że dzieje się tak, ponieważ autor todo.autor nie jest ciągiem znaków. Czy mogę odczytać wartość jako ciąg, czy mogę rzutować obiekt na String?
Dzięki!
Edycja: Oto moja klasa Todo
class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
Czy zmiana autora na StringProperty wpłynie na coś negatywnego? Może mogę całkowicie zrezygnować z castingu.
TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'
jakieś pomysły?'str(todo.author)'
sposób. Nie mam doświadczenia z szablonami Django, ale wygląda na to, że jego mechanizm parsowania jest zawieszany w nawiasach postr
nazwie funkcji. Lub możesz raczej otrzymać właściwość string autora, prawdopodobnie coś podobnegotodo.author.nickname
, bez potrzebystr()
wywołania.W Pythonie możemy skorzystać z
__str__()
metody.Możemy to zmienić w naszej klasie w następujący sposób:
class User: firstName = '' lastName = '' ... def __str__(self): return self.firstName + " " + self.lastName
i podczas biegania
wywoła funkcję
__str__(self)
i wydrukuje firstName i lastNameźródło
str()
jest odpowiednikiem.Jednak powinieneś filtrować swoje zapytanie. W tej chwili Twoje zapytanie to
all()
Todo's.todos = Todo.all().filter('author = ', users.get_current_user().nickname())
lub
todos = Todo.all().filter('author = ', users.get_current_user())
w zależności od tego, co definiujesz autora, jak w modelu Todo. A
StringProperty
lubUserProperty
.Uwaga
nickname
to metoda. Przekazujesz metodę, a nie wynik w wartościach szablonu.źródło
Powinieneś zdefiniować
__unicode__
metodę w swoim modelu, a szablon wywoła ją automatycznie, gdy odwołasz się do instancji.źródło
W funkcji post ():
Tak więc, aby uzyskać str (todo.author), potrzebujesz str (users.get_current_user ()). Co jest zwracane przez funkcję get_current_user ()?
Jeśli jest to obiekt, sprawdź, czy zawiera funkcję str () "?
Myślę, że to błąd.
źródło