2012-06-20 15 views
24

In meinem Flask app erstellen Link, habe ich eine Ansicht, die einen Beitragauf eine URL von Flask app in jinja2 Vorlage

@post_blueprint.route('/post/<int:year>/<int:month>/<title>') 
def get_post(year,month,title): 
    # My code 

zeigt die letzten 10 Einträge anzuzeigen, ich habe folgende Ansicht:

@post_blueprint.route('/posts/') 
def get_all_posts(): 
    # My code 
    return render_template('p.html',posts=posts) 

Jetzt, wenn ich die letzten 10 Beiträge anzeigen, möchte ich den Titel eines Beitrags in einen Hyperlink konvertieren. Derzeit ich habe folgend in meiner jinja Vorlage zu tun, um dies zu erreichen:

<a href="/post/{{year}}/{{month}}/{{title}}">{{title}}</a> 

Gibt es eine Möglichkeit harte Kodierung die URL zu vermeiden?

Wie url_for Funktion, die verwendet wird Flask Urls wie diese zu erstellen:

url_for('view_name',**arguments) 

Ich habe versucht, für eine Suche, aber ich bin nicht in der Lage, es zu finden.

+0

Sie möchten also url_for verwenden kwargs? Der einzige Weg dies zu tun wäre, Beiträge als eine Liste von Diktaten zu haben. Ich glaube nicht, dass es einen Weg dafür gibt, ohne zuerst die Logik in der Sicht zu ändern. – ravenac95

+0

Nein, das möchte ich nicht – codecool

Antwort

57

Ich fühle mich wie Sie hier zwei Fragen sind zu fragen, aber ich werde einen Schuss nehmen ...

Für die Entsendung url würden Sie dies tun:

<a href="{{ url_for('post_blueprint.get_post', year=year, month=month, title=title)}}"> 
    {{ title }} 
</a> 

statische Dateien verarbeiten I ‚d sehr empfehlen ein Asset-Manager wie Flask-Assets verwenden, aber es mit Vanille-Flasche Sie tun, um zu tun:

{{ url_for('static', filename='[filenameofstaticfile]') }} 

Wenn Sie weitere Informationen wünschen, würde ich sehr empfehlen Sie lesen. http://flask.pocoo.org/docs/quickstart/#static-files und http://flask.pocoo.org/docs/quickstart/#url-building

bearbeiten für die Verwendung von kwargs:

Ich dachte, ich gründlichere würde ...

Wenn Sie möchten, dass url_for wie folgt verwenden:

{{ url_for('post_blueprint.get_post', **post) }} 

Sie müssen Ihre Ansicht in etwa so ändern:

@post_blueprint.route('/posts/') 
def get_all_posts(): 
    models = database_call_of_some_kind # This is assuming you use some kind of model 
    posts = [] 
    for model in models: 
     posts.append(dict(year=model.year, month=model.month, title=model.title)) 
    return render_template('p.html', posts=posts) 

dann Ihr Template-Code kann wie folgt aussehen:

{% for post in posts %} 
    <a href="{{ url_for('post_blueprint.get_post', **post) }}"> 
     {{ post['title'] }} 
    </a> 
{% endfor %} 

An dieser Stelle würde ich tatsächlich eine Methode für das Modell erstellen, so dass Sie es in ein dict nicht drehen müssen, sondern geht so weit liegt an Ihnen :-).

+3

Was ist der Typ "Modelle" und warum müssen wir ihn in ein Diktat umwandeln? Können wir es nicht unserer Sichtweise übergeben und dort einfach wiederholen? – Ansd