2012-06-20 9 views
24

En mi aplicación Frasco, que tienen una vista que muestra un postCrear un enlace a una URL de Frasco aplicación en la plantilla Jinja2

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

Para mostrar las últimas 10 entradas, he vista siguiente:

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

Ahora, cuando visualice las últimas 10 publicaciones, quiero convertir el título de una publicación en un hipervínculo. Actualmente tengo que hacer lo siguiente en mi plantilla de jinja para lograrlo:

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

¿Hay alguna manera de evitar codificar duro la url?

Como url_for función que se utiliza para crear direcciones URL Frasco de esta manera:

url_for('view_name',**arguments) 

He intentado buscar para uno, pero yo, no soy capaz de encontrarlo.

+0

¿Desea tener url_for use kwargs? La única forma de hacerlo sería tener publicaciones como una lista de dicts. No creo que haya una manera de hacerlo sin cambiar primero tu lógica en la vista. – ravenac95

+0

No, no quiero que – codecool

Respuesta

57

me siento como si estuviera haciendo dos preguntas aquí, pero voy a tomar una foto ...

para la dirección URL publicación que haría esto:

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

para manejar archivos estáticos I 'd altamente sugerir el uso de un gestor de activos como Flask-Assets, pero hacerlo con el frasco de vainilla que hace:

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

Si desea más información le recomiendo que lea. http://flask.pocoo.org/docs/quickstart/#static-files y http://flask.pocoo.org/docs/quickstart/#url-building

Editar para el uso de kwargs:

Sólo pensé que estaría más a fondo ...

Si desea utilizar url_for así:

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

Tienes que cambiar tu vista a algo como esto:

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

A continuación, el código de la plantilla puede tener este aspecto:

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

En este punto me gustaría crear realmente un método en el modelo por lo que no tiene que convertirlo en un diccionario, pero ir tan lejos depende de ti :-).

+3

¿Cuál es el tipo de 'modelos' y por qué tenemos que convertirlo en un dict? ¿No podemos pasarlo a nuestra vista y simplemente iterar allí? – Ansd

Cuestiones relacionadas