【问题标题】:How to render tags in Flask/GAE?如何在 Flask/GAE 中渲染标签?
【发布时间】:2012-01-14 08:39:42
【问题描述】:

我对所有这些都是新手,并试图弄清楚如何使用标签制作简单的博客文章。 以下是相关部分:

型号:

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 %}

问题是,无论我在标签字段中输入什么,模板都会呈现一个空列表(即“[]”)而不是标签。感谢您提供解决此问题的提示。

【问题讨论】:

    标签: python google-app-engine tags flask wtforms


    【解决方案1】:

    我认为您需要自定义自己的 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
    

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多