Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Django restframework:如何清除/清空与FormData的多个关系_Ajax_Django_Django Rest Framework - Fatal编程技术网

Ajax Django restframework:如何清除/清空与FormData的多个关系

Ajax Django restframework:如何清除/清空与FormData的多个关系,ajax,django,django-rest-framework,Ajax,Django,Django Rest Framework,我正在通过Django rest框架编辑Django用户实例,它运行良好,包括设置/更改组成员资格。 但我无法从所有组中清除/清空该用户 这对我来说在使用httpie的shell上很有效: http -j PATCH :8000/api/accounts/user/1/ groups:='[]' 这是我在浏览器中尝试的内容: var data = new FormData(); data.append('groups', JSON.stringify([])); // not workin

我正在通过Django rest框架编辑Django用户实例,它运行良好,包括设置/更改组成员资格。 但我无法从所有组中清除/清空该用户

这对我来说在使用httpie的shell上很有效:

http -j PATCH :8000/api/accounts/user/1/  groups:='[]'
这是我在浏览器中尝试的内容:

var data = new FormData(); 
data.append('groups', JSON.stringify([])); // not working

$.ajax({
  dataType: 'json',
  url: '/api/accounts/user/1/',
  type: 'PATCH',
  processData: false, 
  contentType: false,
  data: data
});
表单数据如下所示:

------WebKitFormBoundaryJu7QPC8AcBTpWEKJ
Content-Disposition: form-data; name="groups"

[]
答复是:

{"groups": ["Incorrect type.  Expected pk value, received unicode."]}

我想问题在于FormData不能像httpie那样传输原始JSON。 restframework以不同的方式对待它们:

def field_from_native(self, data, files, field_name, into):
    ...
    if self.many:
        try:
            # Form data
            value = data.getlist(field_name)
            if value == [''] or value == []:
                raise KeyError
        except AttributeError:
            # Non-form data
            value = data[field_name]
这个自定义方法使它工作,但我仍然不喜欢这种方法。要清除,请在FormData中附加null:

data.append('groups', null);
并在后端将其设置为空列表:

class FormDataPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
    """
     Custom PrimaryKeyRelatedField which allows clearing via form-data using
     JS's 'null' as to clearing value.
    """
    def field_from_native(self, data, files, field_name, into):
        data = dict(data)
        if self.many:
            if data.get(field_name) == [u'null']:
                data[field_name] = []

        super(FormDataPrimaryKeyRelatedField, self).field_from_native(data, files, field_name, into)


class UserSerializer(serializers.ModelSerializer):

    groups = FormDataPrimaryKeyRelatedField(many=True, source='groups', required=False)