2016-11-07 6 views
-1

Ich benutze Slugify, und ich habe keine Ahnung, wie ich meinen Beitrag Titel slugified, muss ich eine neue Spalte in meinem Beitrag machen? Ich bin den ganzen Tag drangeblieben.Wie verschicken Sie eine URL?

Irgendwelche Vorschläge?

Views.py

@app.route('/posts/<title>') 
@login_required 
def show(title): 

    link = db.session.query(Post).filter_by(title = title).one() 
    link2 = slugify(link.title) 

    return render_template("post.html", post=link2, pid=id, title=link2) 

Models.py

class Post(db.Model): 
    __tablename__ = "posts" 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(80)) 
    body = db.Column(db.Text) 




    def __init__(self, title, body): 
     self.title = title 
     self.body = body 

Fehlermeldung

File "C:\Program Files\Python35-32\lib\site-packages\sqlalchemy\orm\query.py", line 2760, in one 
    raise orm_exc.NoResultFound("No row was found for one()") 
sqlalchemy.orm.exc.NoResultFound: No row was found for one() 
+0

Try loggin 'title'. Wird es richtig empfangen? –

+0

Der Fehler besagt nur, dass es keine Zeile finden kann, während Sie eine Zeile erwarten. Normalerweise verwende ich etwas wie 'Post.query.filter_by (title = title) .first()', dann überprüfe, ob das Ergebnis null ist oder nicht. –

+0

@btquanto können Sie umformulieren, dass ich nicht verstehe? –

Antwort

1

Meine Vermutung ist, Sie sind Verwenden Sie einen Titel für die Beiträge wie "Dies ist mein erster Blog-Post", was großartig ist. Ich nehme auch an, dass Sie den Slug verwenden möchten, um für jeden Beitrag einen URL-freundlichen Permalink zu haben. Im vorherigen Fall wäre der Slug etwas wie "This-is-my-first-blog-post"

Also ein Slug gegeben, wäre Ihr Beitrag auf der/posts/{unique-post-slug} Route verfügbar und nicht/posts/{title}. Mein Vorschlag wäre, den Slug in der Datenbank zu speichern, um den Post abzurufen, da Reverse Slugify nicht so einfach ist.

Ihr Modell Zusammengefasst sollte:

class Post(db.Model): 
    __tablename__ = "posts" 

    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(80)) 
    body = db.Column(db.Text) 
    slug = db.Column(db.Text, index=True) 

    def __init__(self, title, body): 
     self.title = title 
     self.body = body 
     self.slug = slugfiy(title) 

Beachten Sie die index=True Option. Dies wird für eine schnellere Abfrage durchgeführt.

Und die Route, die Ihren Beitrag leisten sollte würde

@app.route('/posts/<slug>') 
@login_required 
def show(slug): 

    post = db.session.query(Post).filter_by(slug=slug).one() 

    return render_template("post.html", post=post) 

In Ihrem post.html-Datei können Sie alle Post-Felder verwenden (id, Titel, Körper, Slug) als post.id, Post. Titel, etc.

+0

'db.Text' dient zum Speichern von mehrzeiligen Texten, stattdessen können Sie' db.string' verwenden. –

2

Sie nehmen slug anstelle von title in Ihrer Ansicht und Abfrage Datenbank basierend auf Slug. Beim Erstellen post slugify den Titel und speichern Sie es in slug Feld.

Views.py

@app.route('/posts/<slug>') 
@login_required 
def show(slug): 
    post = db.session.query(Post).filter_by(slug = slug).first() 
    if post: 
     return render_template("post.html", post=post) 

    abort(404) 

Bitte beachte, dass wir .first statt .one hier verwenden, da .first Rückkehr None wenn keine Stellen während .one löst eine Ausnahme gefunden, die Sie benötigen Fluss zu fangen und machen es nach .

Wenn kein Beitrag gefunden wird, geben wir 404 zurück.

Models.py

class Post(db.Model): 
    __tablename__ = "posts" 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(80)) 
    body = db.Column(db.Text) 
    slug = db.Column(db.String(80), index=True) 

    def __init__(self, title, body): 
     self.title = title 
     self.body = body 
     self.slug = slugify(title) 
+0

Vielen Dank Vivek, ich möchte darauf hinweisen, dass ich Slug = db.Column (db.String (80)) , aber ich habe nicht das Attribut Index = True, wenn ich vorher versucht, danke dafür die Art, wie Sie es erklärt haben, macht viel Sinn. jedoch bekomme ich diesen Fehler sqlalchemy.exc.OperationalError: (SQLITE3.OperationalError) keine solche Spalte: posts.slug [SQL: 'SELECT posts.id AS posts_id, posts.title AS posts_title, posts.body AS posts_body, posts.slug AS posts_slug \ nFROM posts '] Traceback (letzter Aufruf zuletzt) ​​ –

+0

@EliHood Ich denke, Sie haben die Spalte 'slug' noch nicht in Ihrer Posts-Datenbanktabelle erstellt. Sie können die Spalte manuell in die Datenbank einfügen oder wenn Sie 'flask-sqlalchemy' verwenden, können Sie' db.create_all() 'erstellen, um eine Tabelle zu erstellen. –

+0

es funktioniert jetzt, was ich tat, einen anderen SQL-DB-Namen verwendet wird, statt test.db, i verwendet test12.db das ist, wo Sie Ihren DB-Namen auf dem __init__file wie diese app.config indentify [ 'SQLALCHEMY_DATABASE_URI'] = 'sqlite: ///' + os.path.join (tempfile.gettempdir(), 'test122.db') aber immer noch gerne wissen, wie Sie Ihre db vollständig löschen –

Verwandte Themen