J'utilise Mongoengine 0.8.7 + Django 1.6.5, MongoDB 2.7 J'ai modèleMongoengine + Django: erreurs étranges avec des champs pendant le rendu
class Tweet(DynamicDocument):
#user = ReferenceField(User, reverse_delete_rule=CASCADE)
#id = StringField(db_field='id',required=True)
text = StringField(db_field='text', required=True)
lang = StringField(db_field='lang', max_length=200)
slug = StringField(db_field='slug', max_length=200)
retweeted = BooleanField()
#retweet_count = IntField()
text_length = IntField()
date_modified = DateTimeField(default=datetime.now)
is_published = BooleanField(default=True)
tags = ListField(ReferenceField(Tag))
#meta = {'allow_inheritance': False}
def __unicode__(self):
return self.text
def save(self, *args, **kwargs):
self.text_length = len(self.text)
return super(Post, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('post-detail', args=[self.id])
def get_edit_url(self):
return reverse('post-update', args=[self.id])
def get_delete_url(self):
return reverse('post-delete', args=[self.id])
Voir en views.py:
class TweetListView(ListView):
model = Tweet
context_object_name = "tweet_list"
def get_template_names(self):
return ["blog/tweet_list.html"]
def get_queryset(self):
tweets = Post.objects
if 'all_posts' not in self.request.GET:
tweets = tweets.filter(text__startswith='RT')
tag = self.request.GET.get('tag', None)
if tag:
tweets = tweets.filter(tags=tag)
#if not tag:
# tweets = tweets.filter(retweeted=True)
return tweets
et
modèle
{% extends "base.html" %}
{% block content %}
{% for tweet in tweet_list %}
<div style="margin-bottom: 20px;">
<h4>tweet.id: {{ tweet.id }}</h4>
{{ tweet.text|linebreaks }}
tweet.retweeted: {{ tweet.retweeted }}
tweet.created_at: {{ tweet.created_at }}
{% if tweet.tags %}
Tags:
<ul>
{% for tag in tweet.tags %}
<li><a href="?tag={{ tag.id }}">{{ tag }}</a></li>
{% endfor %}
</ul>
{% endif %}
</br>
<a href="{{ tweet.get_absolute_url }}" class="btn btn-small">Read</a>
<a href="{{ tweet.get_edit_url }}" class="btn btn-small">Edit</a>
<a href="{{ tweet.get_delete_url }}" class="btn btn-small">Delete</a>
</div>
{% endfor %}
{% endblock %}
tout fonctionne bien et tweets a montré dans le navigateur tout en vue j'utilise fi ltre is_published=True
mais si je change quelque autre, il commence à jeter des erreurs: Par exemple, j'utilise: text__startswith = 'RT' (texte sur le terrain), résultat:
Exception Value:
id must be an instance of (str, unicode, ObjectId), not <type 'dict'>
Exception Location: D:\WinPython-32bit-2.7.5.1\python-2.7.5\lib\site-packages\bson\objectid.py in __validate, line 203
Si je change de tweets.filter(slug__startswith='RT')
résultat:
Exception Value:
Cannot resolve field "slug"
Exception Location: build\bdist.win32\egg\mongoengine\queryset\transform.py in query, line 60
J'ai extrait des tweets avec un script externe et je veux maintenant utiliser Flask pour interroger la collection existante afin d'afficher les tweets dans l'interface Web. Et je ne veux pas définir toute la structure des tweets dans ORM.
J'ai Robomongo et je vois manuellement ajouté à partir des postes d'administration près des tweets, extrait par la bibliothèque Twitter python. Les champs sont nommés "texte" et "lang" car dans le tweet JSON ils sont nommés pareil. Pourquoi un autre champ ne fonctionne pas?