在Django中处理请求变量的最佳方法

时间:2009-07-16 21:27:41

标签: django request

我有一个'野外'形式,它带有许多不同的变量 - 可能会也可能不会填充。

   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 个答案:

答案 0 :(得分:11)

app_version = request.REQUEST.get("appVersion", "")

get(key, default)是在Python dicts上实现的方法。如果密钥存在于字典中,则返回其值;如果密钥不存在,则返回指定的默认值。在Django中,request对象是类字典对象,因此也以相同的方式为它们定义get

答案 1 :(得分:8)

如果这些变量用于填充表单,则可以安全地将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文档建议直接使用request.POSTrequest.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()

表单将使用值为“1.0”的appVersion进行初始化。但是,如果将POST请求绑定到这样的表单:form = MyForm(request.POST),则会忽略初始属性。这意味着如果POST dict不包含appVersion键,那么该字段将留空。只要不需要该字段,您的表单仍将验证,并且您可以在验证后修改视图中的form.appVersion

答案 2 :(得分:6)

如果您有许多字段,则可能是更紧凑的版本:

defaults = { 'field1' : 'val1', 'field2' : 'val2', ...}
defaults.update(request.POST)