2017-11-15 72 views
10

Używając przykładowego kodu dostarczonego przez Flask-Security, mogę normalnie uzyskać dostęp do formularza login_user.html z trasy /login i to działa dobrze. Chciałbym jednak zamieścić formularz logowania na wszystkich stronach mojej witryny w lewym górnym rogu. Pomyślałem, że mogę użyć oświadczenia Jinja {% include "security/login_user.html" %}, aby umieścić formularz w base.html, ale to nie działa. Pojawia się następujący błąd:Jak umieścić na stronie formularz logowania Flask-Security?

jinja2.exceptions.UndefinedError: 'login_user_form' is undefined 

Czy istnieje sposób, aby włączyć lub osadzić formularza logowania wewnątrz innego szablonu i nadal uzyskać dostęp do danego obiektu formularza?

Odpowiedz

1

Twój ślad stosu brzmi: jinja2.exceptions.UndefinedError: 'login_user_form' is undefined

komunikat Błąd ten pochodzi z Jinja, który mówi, że login_user_form jest niezdefiniowany.

Aby rozwiązać ten problem, jeśli to twój base.html,

... 
{% block content %} 
<form action="" method="post" name="post"> 
    {{form.hidden_tag()}} 
... 

masz zdać login_user_form jako zmienna kontekst swojej renderowania szablonu. Tak więc, w trasie /login, należy zwrócić coś takiego:

return render_template("base.html", 
     title = 'Home', 
     form = login_user_form) 
+2

Jest to oczywista odpowiedź, ale w tym przypadku nie jest zbyt pomocna. Pytasz ich, czy utworzyć i przekazać ten formularz ręcznie dla każdego widoku. Nie pokazujesz, skąd wziąć formularz (pochodzi z Flask-Security). Poza formularzem wymaganym przez ten szablon istnieje także inny kontekst. Nawet jeśli wstawiłeś to za pomocą 'context_processor', to nadal pomija faktyczny problem, co oznacza, że' login_user.html' jest pełnym szablonem strony, nie jest odpowiedni do wstrzykiwania małego formularza na każdej stronie. – davidism

10

security/login_user.html jest pełna strona szablon do formularza logowania. To nie jest to, co chcesz umieścić na każdej stronie, ponieważ zajmuje się innymi sprawami, takimi jak wiadomości błyskawiczne, błędy i układ.

Napisz własny szablon, aby wyświetlić tylko ten formularz i dołącz , który można dodać do szablonu bazowego, podając wartość.

<form action="{{ url_for_security('login') }}" method="POST"> 
    {{ login_user_form.hidden_tag() }} 
    {{ login_user_form.email(placeholder='Email') }} 
    {{ login_user_form.password(placeholder='Password') }} 
    {{ login_user_form.remember.label }} {{ login_user_form.remember }} 
    {{ login_user_form.submit }} 
</form> 

(To jest tylko przykład, będziemy chcieli projektować je dopasować swoją stronę.)

Żaden z twoich poglądów będzie radzić sobie z formularza logowania bezpośrednio, więc login_form i url_for_security aren dostępne podczas renderowania większości szablonów (powodowało to zaobserwowany pierwotny problem). Wstrzyknij je dla każdego żądania, używając app.context_processor.

from flask_security import LoginForm, url_for_security 

@app.context_processor 
def login_context(): 
    return { 
     'url_for_security': url_for_security, 
     'login_user_form': LoginForm(), 
    } 
+0

Dzięki @davidism. Czy użycie 'context_processor' sprawi, że zmienne będą dostępne w _all_ templates? –

+0

Domyślnie będzie dostępny dla renderowanych, rozszerzonych i dołączonych szablonów. – davidism