2013-05-25 14 views
10

Właśnie zaczynam od Flask/Flask-WTF/SQLAlchemy, a większość przykładowego kodu CRUD widzę osobne szablony do dodawania/edycji. Wydaje się, że powtarzają się dwa szablony z niemal identyczną formą html (np. Books_add.html, books_edit.html). Koncepcyjnie bardziej sensowne jest dla mnie posiadanie jednego szablonu, takiego jak "books_form.html", i po prostu wywołanie render_template na tym samym szablonie z dwóch oddzielnych definicji tras. Nie jestem pewien, jak ją osiągnąć jednak coś takiego:Python Flask-WTF - użyj tego samego szablonu formularza dla operacji dodawania i edycji

@app.route('/books/add') 
def add_book(): 
... 
render_template('books_form.html', action = 'add') 


@app.route('/books/edit/<id>') 
def edit_book(id): 
... 
render_template('books_form.html', action = 'edit', id = id) 

ale nie jestem pewien, czy jestem na dobrej drodze, lub odbiegających od najlepszych praktyk. Każde wejście jest doceniane - konkretne przemyślenia na temat obsługi pojedynczego pliku szablonu, aby poradzić sobie z dodawaniem lub edytowaniem zachowania. Powiązania z przykładami są również mile widziane.

Dzięki!

Odpowiedz

15

Nie ma absolutnie żadnego powodu, aby mieć osobne szablony do dodawania/edycji różnych rodzajów rzeczy nawet. Rozważmy:

{# data.html #} 
<!-- ... snip ... --> 
{% block form %} 
<section> 
<h1>{{ action }} {{ data_type }}</h1> 
<form action="{{ form_action }}" method="{{ method | d("POST") }}"> 
{% render_form(form) %} 
</form> 
</section> 
{% endblock form %} 

Zignoruj ​​makro render_form prace (jest to przykład jeden w dokumentacji WTForms') - to po prostu trwa obiekt WTForms typu i renderuje formularza w liście nieuporządkowanej. Następnie można to zrobić:

@app.route("/books/") 
def add_book(): 
    form = BookForm() 
    # ... snip ... 
    return render_template("data.html", action="Add", data_type="a book", form=form) 

@app.route("/books/<int:book_id>") 
def edit_book(book_id): 
    book = lookup_book_by_id(book_id) 
    form = BookForm(obj=book) 
    # ... snip ... 
    return render_template("data.html", data_type=book.title, action="Edit", form=form) 

Ale nie trzeba ograniczać się do tylko książki:

@app.route("/a-resource/") 
def add_resource(): 
    # ... snip ... 
    return render_template("data.html", data_type="a resource" ...) 

# ... etc. ... 
+0

Dziękujemy! Nie jestem pewien, czy rozumiem odniesienie do render_form - wróciłem do dokumentacji WTForms i Quickstart, nie mogłem go znaleźć. Nie mogę go uruchomić w moim kodzie. Dostaję się tam, dokąd zmierzasz - oddzieliłeś swój szablon formularza nawet bardziej, niż myślałem, co lubię. Może, jeśli możesz rozwinąć nieco więcej tego konkretnego kawałka? – David

+1

Możesz użyć makra jinja do renderowania formularza. Zobacz [to sedno] (https://gist.github.com/Teisman/5653607) - większość kodu, który zobaczysz, nie jest mój. Funkcja 'render' jest po prostu generycznym rendererem formularzy. Jak wskazał Sean, jeśli podążysz tą trasą, musisz przekazać instancję formularza do szablonu. – Teisman

+0

Dzięki! to pomaga wyjaśnić. – David