2011-12-06 4 views
5

Sono nuovo di tutti questi e sto cercando di capire come creare un semplice post sul blog con i tag. Qui ci sono le parti pertinenti:Come rendere i tag in Flask/GAE?

Modello:

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

Template:

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

Il problema è che non importa quello che io entro nei tag campo, il modello esegue il rendering di una lista vuota (cioè '[]') invece dei tag. Apprezzo i tuoi suggerimenti per risolvere questo problema.

risposta

3

Penso che sia necessario personalizzare il proprio campo WTForm invece di utilizzare TextField. Ci sono alcuni esempi di codice sul documento di 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