slug field on flask

flask, python, slug

Solution

To persist the slug in the database, I use the following approach (employing the very helpful `python-slugify` library):

from slugify import slugify  # among other things

class Song(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(255))
    slug = db.Column(db.String(255))

    def __init__(self, *args, **kwargs):
        if not 'slug' in kwargs:
            kwargs['slug'] = slugify(kwargs.get('title', ''))
        super().__init__(*args, **kwargs)

Problem

I want to create a slug field stored in database. I searched and I found http://flask.pocoo.org/snippets/5/ but I'm having trouble integrating the code in my app. This is my `modele.py`: ``` from unicodedata import normalize def slugfy(text, encoding=None, permitted_chars='abcdefghijklmnopqrstuvwxyz0123456789-'): if isinstance(text, str): text = text.decode(encoding or 'ascii') clean_text = text.strip().replace(' ', '-').lower() while '--' in clean_text: clean_text = clean_text.replace('--', '-') ascii_text = normalize('NFKD', clean_text).encode('ascii', 'ignore') strict_text = map(lambda x: x if x in permitted_chars else '', ascii_text) return ''.join(strict_text) class Chanteur(db.Model): id = db.Column(db.Integer, primary_key = True) nom = db.Column(db.String(200), index = True, unique = True) slug = db.Column(db.String(255)) chanteurs = db.relationship('Chanson', backref = 'chanteur', lazy = 'dynamic') def __repr__(self): return '<Chanteur %r>' % (self.nom) def __setattr__(self, key, value): super(Chanteur, self).__setattr__(key, value) if key == 'nom': self.slug = slugfy(self.nom) class Chanson(db.Model): id = db.Column(db.Integer, primary_key = True) titre = db.Column(db.String(255)) chanteur_id = db.Column(db.Integer, db.ForeignKey('chanteur.id')) def __repr__(self): return '<Chanson %r>' % (self.titre) ``` It is not working: when I add a new objet (chanteur) the slug field is empty

Original source