На самом деле это интересная проблема, и способ, которым WTForms решает ее, преднамеренно требует явного описания, потому что он связан с безопасностью и не позволяет пользователям подделывать ввод.
Таким образом, намерение состоит в том, что «менеджеры» не могут редактировать имя, а «администраторы» могут.
На первый взгляд это кажется очевидным, просто отключите поле в HTML и напишите свое представление так:
def edit_team():
form = TeamForm(request.POST, obj=team)
if request.POST and form.validate():
form.populate_obj(team) # <-- This is the dangerous part here
return redirect('/teams')
return render('edit_team.html')
Как написано, это серьезная угроза безопасности, поскольку свойство disabled в HTML-формах доступно только на стороне клиента. Любой, у кого есть инспектор HTML (например, FireBug, инспектор документов webkit и т. д.), может удалить это свойство, или кто-то может просто сделать такой запрос:
POST /edit_team/7 HTTP/1.0
Content-Type: application/x-urlencoded
team=EVILTEAMNAME&title=foo
Вопрос тогда, конечно, в том, как мы правильно заблокируем это на стороне сервера, в соответствии с подходящим способом сделать это? Правильный подход к WTForms заключается в отсутствии поля. Есть несколько способов сделать это, один из них - использовать композицию формы и, например, ManagerTeamForm и AdminTeamForm (иногда это лучше), но в других случаях проще используйте del для удаления определенных полей.
Итак, вот как вы могли бы написать свое представление и не иметь проблем с проверкой:
def edit_team():
form = TeamForm(request.POST, obj=team)
if user.role == 'manager':
del form.name
if request.POST and form.validate():
form.populate_obj(team)
return redirect('/teams')
return render('edit_team.html')
И быстрая модификация шаблона:
<html>
<body>
<form action="" method=POST>
{% if 'name' in form %}
{{ form.name() }}
{% else %}
{{ team.name|e }}
{% endif %}
{{ form.title }}
-- submit button --
</form>
</body>
</html>
Некоторые ссылки на лучшие практики wtforms:
person
Crast
schedule
15.05.2013
name
является обязательным полем, но вы не разрешаете указывать значение. Планируете ли вы внедрить его программно? - person dirn   schedule 10.05.2013