在Django中,我创建了一个函数装饰器,在这个例子中,它可以创建一个提供的POST/GET参数的小写版本,并在视图处理之前更新REQUEST。我为此创建了以下装饰器:
def force_lowercase(*fields):
assert isinstance(fields, tuple), "Fields must be of type tuple."
def wrap_func(fn):
def wrapper(request):
post = request.POST.copy()
get = request.GET.copy()
for field in fields:
if field in post:
post[field] = post[field].lower()
if field in get:
get[field] = get[field].lower()
request._post = post
request._get = get
request._request = MergeDict(post,get)
return fn(request)
return wrapper
return wrap_func
在我看来,我会有这样的东西:
@force_lowercase(email,zipcode)
def index(request)
#blabla
这是正确的方法吗?我有点担心我以这种方式破解了Django的WSGIRequest对象,其他Django功能可能看不到更新的GET/POST/REQUEST对象。
如果您使用的是表单,则可以在表单本身中执行小写操作。
虽然实现适用于 IMO,但我有一个问题,对于每个调用,您最终都会复制 get/post 字典,搜索它们,转换字段并将结果追加回您需要了解的request._request
才能使用它。我觉得这有点矫枉过正...
我会用视图中调用的简单方法来更改它(根据您的情况,您可以用小写值覆盖原始值或创建新元素(。
另一种解决方案是通过javascript在HTML页面中执行此操作。您可以(硬(编码模板,创建自定义小部件,或者使用小部件中指定的属性以及 jquery 调用之类的东西......