2011-12-06 13 views
5

Jestem nowy dla tych wszystkich i próbuję wymyślić, jak zrobić prosty post na blogu z tagami. Oto odpowiednie części:Jak renderować tagi w kolbie/GAE?

Model:

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()]) 

Szablon:

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

Problemem jest to, że bez względu na to, co wchodzi w znacznikach pole, szablon renderuje pustą listę (tj. "[]") zamiast znaczników. Doceniam twoje wskazówki, żeby to naprawić.

Odpowiedz

3

Myślę, że trzeba dostosować własne pole WTForm zamiast używać TextField. Istnieje kilka przykładowy kod na dokumencie 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