В Django канонический способ обработки форм:

if request.method == 'POST':
    form = SomeForm(request.POST)
    if form.is_valid():
        use the form data

Я хочу выполнить один и тот же код независимо от того, не было ли POST или форма была неправильной - это несколько строк кода, поэтому мне интересно, есть ли более хороший способ сделать это, чем два дублирующих блока else (один для внутреннего если и один для внешнего)?

2
routeburn 28 Янв 2013 в 03:27

3 ответа

Лучший ответ

Очень краткий способ, который не требует отдельной функции и не повторяет условия:

form = SomeForm(request.POST) if request.method == 'POST' else None

if form and form.is_valid():
    # do your valid-submission stuff
else:
    # do your invalid-submission stuff
5
Amber 27 Янв 2013 в 23:36

Используйте отдельную функцию:

if request.method != 'POST':
    return do_something_function_for_invalid(request)

form = SomeForm(request.POST)
if not form.is_valid():
    return do_something_function_for_invalid(request)

# do something

И затем определите do_something_function_for_invalid() как:

def do_something_function_for_invalid(request):
    # do something

    return response

В качестве альтернативы используйте обработку исключений:

try:
    if request.method != 'POST':
        raise ValueError('invalid form')

    form = SomeForm(request.POST)
    if not form.is_valid():
        raise ValueError('not a POST request')

     # do something
except ValueError as ve:
    # handle ve exception, ve.args[0] is the error message
6
Martijn Pieters 27 Янв 2013 в 23:38

Так просто как

if (request.method != 'POST') or (not SomeForm(request.POST).is_valid()):
   do something
0
furins 27 Янв 2013 в 23:31