Как визуализировать теги в Flask / GAE? - PullRequest
5 голосов
/ 06 декабря 2011

Я новичок во всем этом и пытаюсь понять, как сделать простую запись в блоге с тегами.Вот соответствующие части:

Модель:

class Post(db.Model):
    title = db.StringProperty(required = True)
    content = db.TextProperty(required = True)
    when = db.DateTimeProperty(auto_now_add = True)
    author = db.UserProperty(required = True)
    tags = db.ListProperty(db.Category)

WTForm:

class PostForm(wtf.Form):
    title = wtf.TextField('Title', validators=[validators.Required()])
    content = wtf.TextAreaField('Content', validators=[validators.Required()])
    tags = wtf.TextField('Tags', validators=[validators.Required()])

Шаблон:

{% block content %}
<ul>
    <h1 id="">List of Posts</h1>
    {% for post in posts %}
    <li>
        {{ post.title } By {{ post.author.nickname() }})<br />
        {{ post.content }}<br />
       Author {{ post.author }}  <br />
      Tags {{ post.tags}}  <br />            
    </li>
    {% endfor %}
</ul>
{% endblock %}

Проблема в том, что нетнезависимо от того, что я ввожу в поле тегов, шаблон отображает пустой список (т. е. «[]») вместо тегов.Я ценю ваши советы, чтобы это исправить.

1 Ответ

3 голосов
/ 07 декабря 2011

Я думаю, вам нужно настроить собственное поле WTForm вместо использования TextField.В документе wtforms приведен пример кода.

http://wtforms.simplecodes.com/docs/0.6.1/fields.html#custom-fields

class TagListField(Field):
    widget = TextInput()

    def _value(self):
        if self.data:
            return u', '.join(self.data)
        else:
            return u''

    def process_formdata(self, valuelist):
        if valuelist:
            self.data = [x.strip() for x in valuelist[0].split(',')]
        else:
            self.data = []





class BetterTagListField(TagListField):
    def __init__(self, label='', validators=None, remove_duplicates=True, **kwargs):
        super(BetterTagListField, self).__init__(label, validators, **kwargs)
        self.remove_duplicates = remove_duplicates

    def process_formdata(self, valuelist):
        super(BetterTagListField, self).process_formdata(valuelist)
        if self.remove_duplicates:
            self.data = list(self._remove_duplicates(self.data))

    @classmethod
    def _remove_duplicates(cls, seq):
        """Remove duplicates in a case insensitive, but case preserving manner"""
        d = {}
        for item in seq:
            if item.lower() not in d:
                d[item.lower()] = True
                yield item
...