2012-05-23 14 views
7

trato de traducir un código que utilizo en mis plantillas y JS a un content_type y object_id que está siendo utilizado por la función envuelta:actualización request.POST o request.GET usando una vista decorador

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) 

El punto donde estoy atascado es la actualización de la solicitud.POST/request.GET QueryDict. Django informa que esos dictados son inmutables. ¿Cómo puedo actualizarlos?

Desde el djangodocs pensé que .update usaría la "lógica de último valor" descrita allí, con lo cual estaría perfectamente bien. Pero eso no está sucediendo. La creación de una copia y la reasignación de que a request.GET no parece funcionar bien:

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

No es a somewhat similar question sobre este tema aquí en la SO, pero nunca obtuvo una respuesta satisfactoria. Utilizando el mismo código que en esa pregunta que acaba de obtener un retorno nulo para request.POST o request.GET después de actualizar:

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

ipdb> request.GET 
ipdb> 

Entonces, ¿qué puedo hacer al respecto?

Respuesta

11

El método update(...) no tiene un valor de retorno, actualiza su instancia en el lugar. Por lo tanto, en lugar de request.GET = request.GET.copy().update(ud_dict), debe escribir

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