2012-06-20 15 views
24

W moim Flask app Mam widoku, który wyświetla postaTworzenie łącza do adresu URL kolby aplikacji w szablonie jinja2

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

Aby wyświetlić 10 ostatnich wpisów, mam następujący widok:

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

Teraz, gdy wyświetlam 10 ostatnich postów, chcę przekonwertować tytuł postu na hiperlink. Obecnie mam wykonać następujące czynności w moim jinja szablonu to osiągnąć:

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

Czy istnieje jakiś sposób, aby uniknąć twarde kodowania URL?

Jak url_for funkcji, który służy do tworzenia adresów URL kolby tak:

url_for('view_name',**arguments) 

Próbowałem szukając jednego, ale ja nie jestem w stanie go znaleźć.

+0

A więc chciałbyś mieć adres url_do użycia kwargs? Jedynym sposobem, aby to zrobić, jest umieszczenie postów na liście dykt. Nie wierzę, że jest sposób, żeby to zrobić bez zmiany logiki w widoku. – ravenac95

+0

Nie, nie chcę tego – codecool

Odpowiedz

57

czuję się pytasz dwa pytania tutaj, ale wezmę strzał ...

adresu URL księgowania chcesz to zrobić:

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

do obsługi plików statycznych I byłyby wysoce sugerować przy użyciu menedżera zasobów jak Flask-Assets, ale zrobić to z waniliowym kolby zrobić:

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

Jeśli chcesz więcej informacji Gorąco polecam lekturę. http://flask.pocoo.org/docs/quickstart/#static-files i http://flask.pocoo.org/docs/quickstart/#url-building

Edycja za korzystanie kwargs:

Pomyślałem, że mogę być bardziej dokładne ...

Jeśli chcesz użyć url_for tak:

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

Musisz zmienić swój widok na coś takiego:

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

Następnie kod szablonu może wyglądać następująco:

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

W tym momencie chciałbym rzeczywiście stworzyć metodę na modelu, dzięki czemu nie trzeba przekształcić go w dict, ale dzieje się tak daleko to zależy od Ciebie :-).

+3

Jaki jest typ "modeli" i dlaczego musimy go przekształcić w dyktando? Czy nie możemy przekazać tego do naszego punktu widzenia i po prostu powtórzyć? – Ansd

Powiązane problemy