7

テンプレートと 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)

私が立ち往生しているポイントは、request.POST / request.GET QueryDict の更新です。Django は、これらの辞書を不変であると報告します。どうすれば更新できますか?

djangodocsから、 .updateはそこに記述されている「最後の値のロジック」を使用すると思いましたが、これで問題ありません。しかし、それは起こっていません。コピーを作成し、それを request.GET に再割り当てしても、うまくいかないようです:

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

このトピックについては、SO でやや似たような質問がありますが、満足のいく答えは得られませんでした。その質問と同じコードを使用すると、更新後に request.POST または request.GET に対して null が返されます。

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

ipdb> request.GET
ipdb> 

それで、私はこれについて何ができますか?

4

1 に答える 1

11

update(...)メソッドには戻り値がなく、そのインスタンスをその場で更新します。だからあなたの代わりにrequest.GET = request.GET.copy().update(ud_dict)書くべきです

request.GET = request.GET.copy()
request.GET.update(ud_dict)
于 2012-05-23T08:37:04.693 に答える