Декоратор перезаписывает POST, GET и REQUEST в Django - правильно? - PullRequest
1 голос
/ 01 февраля 2012

В 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.

1 Ответ

1 голос
/ 01 февраля 2012

Если вы используете форму, вы можете использовать строчные буквы в самой форме.

Хотя реализация работает в IMO, у меня проблема в том, что при каждом вызове вы копируете словари get / post, просматриваете их, конвертируете поля и добавляете результат обратно как request._request, что вам нужно знать о возможности использовать его. Я думаю, что это немного излишне ...

Я бы изменил его простым методом, вызываемым в представлении (в зависимости от вашей ситуации, вы можете либо перезаписать исходные значения строчными, либо создать новые элементы).

Другим решением может быть сделать это на HTML-странице через JavaScript. Вы можете (жестко) закодировать шаблон, создать собственный виджет или использовать что-то вроде атрибута, указанного в виджете, плюс вызов jquery ...

...