2012-06-20 9 views
24

Nel mio Flask app, ho una visione che mostra un postCreazione di link ad un URL di Flask applicazione nel modello Jinja2

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

Per visualizzare le ultime 10 voci, ho seguente vista:

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

Ora, quando visualizzo gli ultimi 10 post, voglio convertire il titolo di un post in un hyperlink. Attualmente ho di fare quanto segue nel mio modello Jinja per raggiungere questo obiettivo:

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

C'è un modo per evitare di difficile codifica l'url?

Come url_for funzione che viene utilizzato per creare URL Flask in questo modo:

url_for('view_name',**arguments) 

ho provato a cercare per uno ma io, non sto in grado di trovarlo.

+0

Quindi vorresti avere url_per usare kwargs? L'unico modo per farlo sarebbe avere i post come elenco di dict. Non credo che ci sia un modo per farlo senza prima cambiare la logica nella vista. – ravenac95

+0

No, non voglio che sia – codecool

risposta

57

mi sento come se stessi chiedendo due domande qui, ma mi prendo un colpo ...

per l'URL distacco faresti questo:

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

per gestire i file statici I 'd altamente suggerirei di usare un asset manager come Flask-Assets, ma per farlo con la boccetta di vaniglia che fai:

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

Se vuoi maggiori informazioni consiglio vivamente di leggere. http://flask.pocoo.org/docs/quickstart/#static-files e http://flask.pocoo.org/docs/quickstart/#url-building

Modifica per l'utilizzo di kwargs:

Ho pensato di essere più approfondita ...

Se vuoi utilizzare url_for come questo:

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

È necessario modificare la visualizzazione a qualcosa di simile:

@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) 

Poi il codice del modello può assomigliare a questo:

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

A questo punto vorrei davvero creare un metodo sul modello in modo da non dover trasformarlo in un dizionario, ma andando così lontano sta a te :-).

+3

Qual è il tipo 'models' e perché abbiamo bisogno di trasformarlo in un dict? Non possiamo passarlo alla nostra vista e solo iterare lì? – Ansd

Problemi correlati