Estoy escribiendo una aplicación de lista de tareas pendientes para ayudarme a comenzar con Python. La aplicación se ejecuta en GAE y estoy almacenando elementos de tareas pendientes en el almacén de datos. Quiero mostrarles los artículos de todos, y solo a ellos. El problema es que la aplicación actualmente muestra todos los elementos a todos los usuarios, así que puedo ver lo que escribes y tú ves lo que escribo. Pensé que lanzar mi objeto todo.author a una cadena y ver si coincide con el nombre del usuario sería un buen comienzo, pero no sé cómo hacerlo.
Esto es lo que tengo en mi 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('/')
En mi index.html tenía esto originalmente:
<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>
pero me gustaría mostrar elementos solo al usuario que los creó. Pensé en intentarlo
{% for todo in todos %}
{% ifequal todo.author nickname %}
<input type="checkbox"> {{todo.item}} <hr />
{% endifequal %}
{% endfor %}
en vano. La lista aparece en blanco. Supuse que es porque todo.author no es una cadena. ¿Puedo leer el valor como una cadena o puedo convertir el objeto en String?
¡Gracias!
Editar: Aquí está mi clase de Todo
class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)
¿Cambiar mi autor a StringProperty afectará algo negativamente? Quizás pueda renunciar al casting por completo.
TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'
alguna idea?'str(todo.author)'
como tal. No tengo experiencia con las plantillas de Django, pero parece que su mecanismo de análisis se bloquea en el paréntesis después delstr
nombre de la función. O puede que prefiera obtener la propiedad de cadena del autor, posiblemente algo asítodo.author.nickname
, sin la necesidad de lastr()
llamada.En Python podemos usar el
__str__()
método.Podemos anularlo en nuestra clase de esta manera:
class User: firstName = '' lastName = '' ... def __str__(self): return self.firstName + " " + self.lastName
y al correr
llamará a la función
__str__(self)
e imprimirá el nombre y apellidofuente
str()
es el equivalente.Sin embargo, debería filtrar su consulta. Por el momento tu consulta es de
all()
Todo.todos = Todo.all().filter('author = ', users.get_current_user().nickname())
o
todos = Todo.all().filter('author = ', users.get_current_user())
dependiendo de lo que esté definiendo autor como en el modelo Todo. A
StringProperty
oUserProperty
.La nota
nickname
es un método. Está pasando el método y no el resultado en valores de plantilla.fuente
Debe definir el
__unicode__
método en su modelo y la plantilla lo llamará automáticamente cuando haga referencia a la instancia.fuente
En función post ():
Entonces, para obtener str (todo.author), necesitas str (users.get_current_user ()). ¿Qué devuelve la función get_current_user ()?
Si es un objeto, verifique si contiene una función str () "?
Creo que el error está ahí.
fuente