To jest rzeczywiście ciekawy problem, a sposób WTForms rozwiązuje to celowo coś, co wymaga jednoznaczność, ponieważ ma to związek z bezpieczeństwem i nie pozwalając użytkownikom na fałszywych danych wejściowych.
Chodzi o to, że "menedżerowie" nie mogą edytować nazwy, podczas gdy "administratorzy" mogą.
Na pierwszy rzut oka wydaje się to oczywiste, wystarczy wyłączyć pola w HTML i napisz swój pogląd takiego:
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')
Jak napisano, jest to poważne zagrożenie dla bezpieczeństwa, ponieważ własność niepełnosprawnych w formularzach HTML jest po stronie klienta tylko. Każdy z inspektorem HTML (tj FireBug, WebKit Inspektor dokumentów, itp) można usunąć tę właściwość, czy ktoś może po prostu złożyć zamówienie tak:
POST /edit_team/7 HTTP/1.0
Content-Type: application/x-urlencoded
team=EVILTEAMNAME&title=foo
Kwestia następnie jest oczywiście jak mamy brama to właściwie po stronie serwera, odpowiadające odpowiedniemu sposobowi wykonania tego? Prawidłowe podejście z WTForms to nie ma pola na pierwszym miejscu. Można to zrobić na kilka sposobów, jednym jest użycie kompozycji formularzy i np. ManagerTeamForm i AdminTeamForm (czasami jest to lepsze), ale innym razem łatwiej jest use del to remove specific fields.
Więc oto jak można napisać swój pogląd, a nie mieć problemów Walidacja:
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')
i szybki modyfikację szablonu:
<html>
<body>
<form action="" method=POST>
{% if 'name' in form %}
{{ form.name() }}
{% else %}
{{ team.name|e }}
{% endif %}
{{ form.title }}
-- submit button --
</form>
</body>
</html>
Niektóre kawałki odniesienia dla wtforms najlepsze- praktyki:
Czy możesz udostępnić swój kod formularza? – codegeek
@codegeek: Zaktualizowano kod formularzy. – rajpy
Czy możesz podać trochę informacji na temat tego, jaki jest Twój cel? "name" jest polem wymaganym, ale nie pozwalasz na podanie wartości. Czy planujesz wstrzyknąć jeden programowo? – dirn