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


87

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로 변경하면 부정적인 영향을 미칩니 까? 캐스팅을 아예 잊을 수있을 것 같습니다.

답변:


92

파이썬에서, 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)'합니다. 아이디어가 있습니까?
Amru E. 2013

1
'str(todo.author)'이렇게 따옴표를 붙여 보세요 . 나는 Django 템플릿에 익숙하지 않지만 파싱 메커니즘이 str함수 이름 뒤의 괄호에 걸려있는 것 같습니다 . 또는 호출 todo.author.nickname할 필요없이 작성자의 문자열 속성을 가져올 수 있습니다 str().
Jeff Lockhart

드디어 작동하게되었습니다! 나는 if 문에서 todo.author.nickname을 사용하고 그 값이 현재 사용자의 별명과 일치하는지 확인했습니다. 내가 수락 할 수 있도록 해당 내용을 포함하도록 답변을 수정하십시오.
Amru E. 2013

35

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

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

class User: 

    firstName = ''
    lastName = ''
    ...

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

그리고 달릴 때

print(user)

함수를 호출하고 __str__(self) firstName과 lastName을 인쇄합니다.


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입니다. 원래 질문에 추가하겠습니다.
Amru E. 2013

나는 django 템플릿을 사용하지 않기 때문에 그들이 무엇을할지 모르겠습니다. 일부 템플릿 시스템은 자동으로 콜 러블 (nickname ())을 호출합니다
Tim Hoffman

필터가 어떤 역할을하는지 간단히 설명해 주시겠습니까? 내 todos = Todo.all ()의 실제 기능이 무엇인지 잘 모르겠습니다.
Amru E.

예제 코드에서 알 수 있듯이 filter는 쿼리 인수, 특히 author property = some value입니다. 당신은 정말로 문서를 읽는 데 약간의 시간을 할애하면 많은 시간을 절약 할 수 있습니다. developers.google.com/appengine/docs/python/datastore 는 데이터 저장소와 데이터 가져 오기 / 입력 및 쿼리 방법에 대해 설명합니다.
Tim Hoffman

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 ()는 사용자에게 읽을 수있는 이름을 제공하기 위해 nickname ()이있는 User 객체를 반환합니다. 닉네임을 제대로 알아내는 데 문제가 있었는데 알아 냈어요. 감사!
Amru E. 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.