¿Cómo enviar los resultados de la consulta a un campo WTForm?

Utilizo SQLalchemy con una tabla de muchos a muchos para administrar las tags de publicaciones de blog. Necesito ayuda para representar los valores de la etiqueta en un campo de formulario TextArea donde se pueden editar. Ahora mismo cuando renderizo veo la consulta de búsqueda.

Modelo

La relación entre la etiqueta y la publicación se define en `tags ‘

class Tag(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True) url = db.Column(db.String(120), unique=True) def __init__(self, name, url): self.name = name self.url = url class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80)) body = db.Column(db.Text) pub_date = db.Column(db.DateTime) tags = db.relationship('Tag', secondary=posts_tags, backref='posts', lazy='dynamic') class Tag(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True) url = db.Column(db.String(120), unique=True) 

Mi problema es renderizar el campo de tags en WTF. I muestra la consulta en el campo en lugar de los resultados.

Veo dos opciones para corregir, pero tampoco sé cómo hacerlo …

a.) En la vista, interactúe a través de tags y visualice los valores. b.) En un campo personalizado, de alguna manera pase el ID de la publicación y ejecute una consulta antes de volver al campo. Algo como esto….

Field Hack Eso funciona, pero sepa cómo pasar dinámicamente la ID de publicación al campo. *

 class TagListField(Field): widget = TextArea() def _value(self): q = Post.query.join(posts_tags, (posts_tags.c.post_id == {{ NEED HELP HERE}})) taglist = [] for p in q: for t in p.tags: taglist.append(t.name) taglist return ", ".join(taglist) def process_formdata(self, valuelist): if valuelist: self.data = [x.strip() for x in valuelist[0].split(',')] else: self.data = [] 

Me gustaría ver opciones de visualización y campo … Gracias y avance …

Está utilizando _valor incorrectamente, se utiliza para mostrar los datos, no para establecer los datos.

Los datos se configuran en el formulario, no en el campo.

 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 PostForm(Form): title = StringField(u'title', validators=[DataRequired()]) body = StringField(u'Text', widget=TextArea()) pub_date = DateTimeField(u'date create') topic = QuerySelectField(query_factory=enabled_topics, allow_blank=True) tags = TagListField(u'Tags') # here you use your custom field # a method to set the tags def fill_tags(self, tags): self.tags.data = tags # and from the view that is creating the form you send the list of tags 

en su opinión:

 form = PostForm() form.fill_tags([tag.name for tag in post.tags.all()])