2011-12-06 3 views
5

저는이 모든 것을 처음 접했고 태그로 간단한 블로그 게시물을 작성하는 방법을 알아 내려고했습니다. 다음은 관련 부분은 다음과 같습니다Flask/GAE에서 태그를 렌더링하는 방법은 무엇입니까?

모델 :

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

문제는 그 내가 태그에 입력 상관없이 필드의 경우 템플릿 대신 태그 대신 빈 목록 (예 : '[]')이 렌더링됩니다. 이 문제를 해결할 수있는 힌트를 주셔서 감사합니다.

답변

3

TextField 대신 자신의 WTForm 필드를 사용자 지정해야한다고 생각합니다. 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