Лучший способ обработки переменных запроса в Django - PullRequest
1 голос
/ 17 июля 2009

У меня есть форма «в дикой природе», которая принимает много разных переменных - которые могут быть или не быть заполнены.

   try:
        app_version = request.REQUEST["appVersion"]
    except:
        app_version = ''

    try:
        app_name = request.REQUEST["appName"]
    except:
        app_name = ''

    try:
        app_code_name = request.REQUEST["appCodeName"]
    except:
        app_code_name = ''

Есть ли более надежный способ сделать это?

Ответы [ 3 ]

11 голосов
/ 17 июля 2009
app_version = request.REQUEST.get("appVersion", "")

get(key, default) - метод, реализованный на Python dicts. Если ключ существует в словаре, возвращается его значение; если ключ не существует, возвращается указанное значение по умолчанию. В Django request объекты являются словарными объектами, поэтому get также определяется для них таким же образом.

8 голосов
/ 17 июля 2009

Если эти переменные предназначены для заполнения формы, то вы можете безопасно передать объект request.POST непосредственно в конструктор формы.

if request.method == 'POST':
    form = MyForm(request.POST)

Форма будет автоматически передавать правильные значения в правильные поля формы и использовать значения по умолчанию для ключей, которых не существует , и все равно будет создавать пустые поля для отсутствующих ключей (см. Приложение).

Если вы пытаетесь обработать форму, все же лучше создать объект формы, как указано выше, и считать значения из этого объекта.

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
        # You may process these variables here
        print form.appVersion
        print form.appName
        print form.appCodeName

Помните, что код валидации лучше всего размещать и в классе формы. Таким образом, если form.is_valid() вернет True, то вы знаете, что у вас есть чистый набор данных для работы.

Примечание: Django docs рекомендует использовать request.POST или request.GET напрямую, а не объединенную переменную request.REQUEST, поскольку она более явная.

Добавление:

Важно понимать разницу между связанными и несвязанными формами в этом случае. Если вы создаете несвязанную форму с form = MyForm(), то при создании экземпляра формы все поля будут заполнены свойством initial каждого поля (если оно существует). Например, с этим кодом:

from django import forms

class MyForm(forms.Form):
    appVersion = forms.CharField(initial='1.0')
    appName = forms.CharField()
    appCodeName = forms.CharField()

форма будет инициализирована с appVersion со значением '1.0'. Однако если вы связываете запрос POST с формой, подобной этой: form = MyForm(request.POST), то начальные свойства игнорируются. Это означает, что если в диктовке POST нет ключа appVersion, это поле останется пустым. Пока поле не является обязательным, ваша форма будет по-прежнему проверяться, и вы можете изменить form.appVersion в представлении после проверки.

6 голосов
/ 17 июля 2009

Если у вас много полей, может быть более компактная версия:

defaults = { 'field1' : 'val1', 'field2' : 'val2', ...}
defaults.update(request.POST)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...