[python] Python에 toString ()과 동등한 기능이 있으며 db.Model 요소를 String으로 변환 할 수 있습니까?

Python을 시작하는 데 도움이되는 ToDo 목록 앱을 작성 중입니다. 앱이 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으로 캐스트 할 수 있습니까?

감사!

편집 : 여기 내 할일 클래스입니다

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

저자를 StringProperty로 변경하면 부정적인 영향을 미칩니 까? 캐스팅을 아예 잊을 수있을 것 같습니다.



답변

파이썬에서, str()방법은 받는 사람과 유사하다 toString()다른 언어 방법. 문자열로 변환 할 객체를 매개 변수로 전달하는 것을 호출합니다. 내부적 __str__()으로는 매개 변수 객체 의 메서드를 호출하여 문자열 표현을 얻습니다.

그러나이 경우 에는 별칭 문자열과 UserProperty유형 인 데이터베이스 의 작성자를 비교 users.User합니다. nickname대신에 작성자 의 속성을 todo.author.nickname템플릿에서 비교하고 싶을 것 입니다.


답변

파이썬에서 우리는 __str__()방법을 사용할 수 있습니다 .

다음과 같이 클래스에서 재정의 할 수 있습니다.

class User:

    firstName = ''
    lastName = ''
    ...

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

그리고 달릴 때

print(user)

함수를 호출하고 __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 () 함수에서 :

todo.author = users.get_current_user()

따라서 str (todo.author)를 얻으려면 str (users.get_current_user ())가 필요합니다. get_current_user () 함수는 무엇을 반환합니까?

객체 인 경우 str () “함수가 포함되어 있는지 확인하십시오 .

오류가 거기에 있다고 생각합니다.


답변