2015-02-18 4 views
0

У меня почти есть x-редактируемая работа с django API, созданная с помощью tastypie, благодаря различным другим ответам на stackoverflow, но не совсем.tastypie и x-editable using patch

Вот HTML:

<a href="#" id="field_name" class="editable" 
           data-name="name" 
           data-pk="{{ object.id }}" 
           data-value="{{ object.name }}" 
           data-title="Meeting Name"> 
          {{ object.name }}</a> 

и JavaScript:

$('.editable').on('init', function(e, edt) { 
     edt.options.url = '/api/v1/update_meeting/' +edt.options.pk; 
    }); 
    $('.editable').editable({ 
     mode: 'inline', 
     ajaxOptions: { 
      type: 'PATCH' 
     }, 


     success: function(response, newValue) { 

      // nothing to do 
     } 

    }); 

И tastypie ресурс:

класс UpdateMeetingResource (ModelResource):

class Meta: 
    queryset = Meeting.objects.all() 
    resource_name = 'update_meeting' 
    limit = 0 
    include_resource_uri = False 
    list_allowed_methods = ['get','patch',] 
    detail_allowed_methods = ['get', 'patch'] 
    serializer = urlencodeSerializer() 
    authentication = Authentication() 
    authorization = Authorization() 

Моипроблема только в том, что имя поля обновляется с именем, а не значением в значении данных. Прежде чем я ввел атрибут data-name, он установил значение «field_name».

Я мог бы исправить это, просто изменив метод patch-detail в моем ресурсе tastypie, но было бы неплохо заставить его работать, не делая этого.

+0

Решено это временно путем подклассификации патча-детали. Имейте лучшее решение в виду и запишите здесь, когда у меня есть работа ... – PhoebeB

ответ

0

Таким образом, проблема заключалась в том, что отправляемый патч был парой ключевых значений, и это не было распознано tastypie, но быстрое модификацию для гидрата исправляет его. Может быть, не самое лучшее решение, но вот то, что работает для меня:

HTML-:

<a href="#" id="name" class="editable editable_default_setup" 
     data-title="Name" 
     data-pk="{{ object.pk }}" 
     data-value="{{ object.name }}" 
     data-placeholder="Meeting Name" > 
     {{ object.name }}</a> 

Javascript:

$('.editable').on('init', function(e, edt) { 
    edt.options.url = '/api/v1/meeting/' + {{ object.id }}; 
}); 

$.fn.editable.defaults.ajaxOptions = {type: "PATCH"}; 

$('.editable_default_setup').editable(); 

Настройка ресурса:

class Meta: 
    queryset = Meeting.objects.all() 
    include_resource_uri = False 
    resource_name = 'meeting' 
    limit = 100 
    allowed_methods = ['post','put','get','options','patch', 'delete'] 
    detail_allowed_methods = ['patch'] 
    authentication = Authentication() 
    authorization = Authorization() 
    serializer = urlencodeSerializer() 
    always_return_data=True 

Важный бит, Модификация ресурса tastypie:

def hydrate(self, bundle): 

    if bundle.request.method == "PATCH": 
     # data is supplied by x-editable in format {u'pk': u'1170', u'name': u'owner', u'value': u'5', u'format': u'json'} 
     # apply this value to the obj and return 

     field_name = bundle.data['name'] 
     field_value = bundle.data['value'] 

     # the use of name is unfortunate as it can override a field called name, so put it back to original value unless updating it 
     # do the same with value, just in case 

     bundle.data['name'] = getattr(bundle.obj, 'name', None) 
     bundle.data['value'] = getattr(bundle.obj, 'value', None) 

     # now set the attribute field_name to field_value so object will update 
     bundle.data[field_name] = field_value 
     setattr(bundle.obj, field_name, field_value) 


return bundle 
Смежные вопросы