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

Ada*_*son 1 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 = ''
Run Code Online (Sandbox Code Playgroud)

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

mip*_*adi 11

app_version = request.REQUEST.get("appVersion", "")
Run Code Online (Sandbox Code Playgroud)

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


six*_*ear 8

如果这些变量用于填充表单,则可以安全地将request.POST对象直接传递给表单构造函数.

if request.method == 'POST':
    form = MyForm(request.POST)
Run Code Online (Sandbox Code Playgroud)

表单将自动将正确的值传递给正确的表单字段,并使用不存在的键的默认值,并仍然为缺少的键创建空白字段(请参阅附录).

如果您正在尝试处理表单,最好如上所述创建表单对象,并从该对象中读取值.

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
Run Code Online (Sandbox Code Playgroud)

请记住,验证代码也最好放在表单类中.这样,如果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()
Run Code Online (Sandbox Code Playgroud)

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


ogg*_*ggy 6

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

defaults = { 'field1' : 'val1', 'field2' : 'val2', ...}
defaults.update(request.POST)
Run Code Online (Sandbox Code Playgroud)

  • 它不会修改POST字典,它会修改"默认值"字典.然后,您将默认字典传递给表单而不是POST字典. (2认同)