1

我有一个“在野外”的表格,它需要许多不同的变量——可能会填充也可能不会填充。

   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 = ''

有没有更严格的方法来实现这一点?

4

3 回答 3

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

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

于 2009-07-16T21:29:30.357 回答
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.POSTorrequest.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后您可以在视图中进行修改。

于 2009-07-16T21:50:34.260 回答
6

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

defaults = { 'field1' : 'val1', 'field2' : 'val2', ...}
defaults.update(request.POST)
于 2009-07-16T22:01:52.707 回答