知乎的标签是这样的
用Select 2实现的是这样的
实现分类
Select2主要是用来美化分类表单,在使用之前要先实现分类的功能,简单的可以一对多,难一点可以搞一个多对多
一对多关系的分类
如果只是想一篇文章设置一个分类,可以用一对多,“一”这边是某个分类,然后“多”这一边就是要添加到该分类下的文章,书中虽然没有直接实现这样的分类功能,但是已经实现了一对多的关系,可以参考着来实现,书中的是Post模型跟Comment模型的一对多,实现一对多关系的分类,可以将Post模型换成Category模型,Comment对应地换成Post,参考代码:
class Category(db.Model):
__tablename__ = 'categories'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(32), unique=True, index=True,
nullable=False)
posts = db.relationship('Post', backref='category', lazy='dynamic')
# 可以添加一个generate_fake函数,用来测试的时候生成假的分类
@staticmethod
def generate_fake(count=100):
from sqlalchemy.exc import IntegrityError
from random import seed, randint
import forgery_py
seed()
for i in range(count):
t = Category(name=forgery_py.lorem_ipsum.word())
db.session.add(t)
try:
db.session.commit()
except IntegrityError:
db.session.rollback()
def __repr__(self):
return '<Category %r>' % self.name
# 写完了Category类,相应地在Post类里面改一下
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.Text)
body = db.Column(db.Text)
body_html = db.Column(db.Text)
summary = db.Column(db.Text)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
comments = db.relationship('Comment', backref='post', lazy='dynamic')
category_id = db.Column(db.Integer, db.Foreign