Обновите request.POST или request.GET с помощью декоратора представления

Я пытаюсь перевести код, который я использую в своих шаблонах и js, в content_type и object_id, которые используются обернутой функцией:

def translate_modelcode(function=None,redirect_field_name=None):
    """
    translate an item-code specified in settings to a content_type
    and the item-id to the object_id
    """

    def _decorator(function):
        def _wrapped_view(request, *args, **kwargs):

            item_code=request.REQUEST.get('item-code',None)
            if item_code:
                object_id = request.REQUEST.get('item-id',None)
                # resolve_modelcode get's the models name from settings
                content_type = resolve_modelcode(item_code)
                ud_dict = {'content_type':content_type,
                          'object_id':object_id}
                if request.method == 'GET':
                    request.GET.update(ud_dict)
                else:
                    request.POST.update(ud_dict)


            return function(request, *args, **kwargs)
        return _wrapped_view

    if function is None:
        return _decorator
    else:
        return _decorator(function)

Точка, в которой я застрял, это обновление запроса.POST / request.GET QueryDict. Django сообщает, что эти слова неизменны. Как я могу их обновить?

Из djangodocsя подумал, что .update будет использовать описанную там «логику последнего значения», с которой я был бы совершенно согласен. Но этого не происходит. Создание копии и переназначение ее в request.GET, похоже, тоже не работает:

request.GET = request.GET.copy().update(ud_dict)

Существует несколько похожий вопроспо этой теме здесь, на SO, но он так и не получил удовлетворительного ответа. Используя тот же код, что и в этом вопросе, я просто получаю нулевое значение для request.POST или request.GET после обновления:

request._get = request.GET.copy()
import ipdb;ipdb.set_trace()

ipdb> request.GET
ipdb> 

Итак, что я могу с этим сделать?

7
задан Community 23 May 2017 в 12:33
поделиться