2013-05-25 12 views
10

Sadece Flask/Flask-WTF/SQLAlchemy ile çalışmaya başladım ve çoğu örnekte gördüğüm CRUD kodu, ekleme/düzenleme için ayrı şablonlar gösteriyor. Neredeyse aynı form html (ör. Books_add.html, books_edit.html) ile iki şablona sahip olmak tekrarlayıcı görünmektedir. Kavramsal olarak, "books_form.html" gibi bir şablona sahip olmak için bir mantığa sahip olmak ve aynı şablon üzerinde render_template öğesini iki ayrı rota tanımından çağırmak daha mantıklı.Python Flask-WTF - işlemleri eklemek ve düzenlemek için aynı form şablonunu kullanın

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

ama ben doğru yolda olduğumu emin, ya da en iyi uygulama sapan değilim: Ben, gerçi gibi bir şey bunu başarmak için nasıl emin değilim. Herhangi bir girdi takdir edilir - davranış ekleme veya düzenleme ile başa çıkmak için tek şablon dosyasının nasıl işleneceği ile ilgili belirli düşünceler. Örneklere bağlantılar da açıktır.

Teşekkürler!

cevap

15

öğelerinin eklenmesi/düzenlenmesi için ayrı şablonlara sahip olmanızın kesinlikle bir nedeni yoktur. Düşünün:

{# 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 %} 

makro render_form Yoksay çalışır (WTForms' belgelerinde örnek bir tane var) - bu sadece bir WTForms tipi nesnesini alır ve bir sırasız listede formunu oluşturur.

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

Ama kendini sadece kitapları sınırlamak gerekmez: Daha sonra bunu yapabilirsiniz

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

# ... etc. ... 
+0

Teşekkür! Render_form referansını anladığımdan emin değilim - WTForms belgelerine ve Quickstart'a geri döndüm, bulamadım. Kodumda çalışamıyorum. Nereye gittiğimi anladım - form şablonunu düşündüğümden çok daha fazlasını oluşturdunuz. Belki o parçanın biraz daha fazlasını yapabilirsen? – David

+1

Formunuzu oluşturmak için bir jinja makrosu kullanabilirsiniz. [Bu özgeçmişe bakın] (https://gist.github.com/Teisman/5653607) - orada göreceğiniz kodun çoğu benim değil. 'Render' işlevi sadece çok genel bir form oluşturucu. Sean'ın da belirttiği gibi, bu rotayı izlerseniz form örneğini şablona aktarmanız gerekir. – Teisman

+0

Teşekkürler! Bu açıklığa yardımcı olur. – David