Django остальные рамки "Это поле обязательно для заполнения" в поле отношений - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь отправить сообщение в DRF API из интерфейса пользователя.Вот часть реакции:

handleSubmit(event) {
        event.preventDefault();

        let album = {'name': this.state.selected_album, 'musician': {'name': this.state.selected_musician}};

        let formData = new FormData();
        formData.append('title', this.state.title);
        formData.append('upload', this.state.file);
        formData.append('youtube', this.state.youtube);
        formData.append('genre', this.state.selected_genre);
        formData.append('album', JSON.stringify(album));

        fetch('/api/music/track/', {
            body: formData,
            method: 'post',
            headers: {
                'Authorization': 'Token ' + localStorage.getItem('token'),
            }
        }).then(function (data) {
            return data.json();
        }).then(function(data) {
            console.log(data);
        }).catch(function (err) {
            console.error(err);
        })
    }

Затем я получил этот ответ: {"album":["This field is required."]}

Я проверил вкладку сети браузера, там не было пустого поля альбома.Тело запроса:

-----------------------------139814953515753314481268355557
Content-Disposition: form-data; name="title"

assa
-----------------------------139814953515753314481268355557
Content-Disposition: form-data; name="youtube"


-----------------------------139814953515753314481268355557
Content-Disposition: form-data; name="genre"

Roc
-----------------------------139814953515753314481268355557
Content-Disposition: form-data; name="album"

{"name":"5ugi5ht5i","musician":{"name":"sdfaf"}}
-----------------------------139814953515753314481268355557--

заголовок запроса:

Host: localhost:3000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Referer: http://localhost:3000/upload
authorization: Token ****
content-type: multipart/form-data; boundary=---------------------------139814953515753314481268355557
origin: http://localhost:3000
Content-Length: 564
Cookie: csrftoken= **; tabstyle=raw-tab
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Сериализаторы:

class MusicianSerializer(ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault(),
    )
    picture = serializers.ImageField(allow_null=True, write_only=True)
    picture_thumbnail = serializers.ImageField(read_only=True)

    class Meta:
        model = Musician
        fields = '__all__'


class AlbumSerializer(ModelSerializer):
    musician = MusicianSerializer()
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault(),
    )
    picture = serializers.ImageField(allow_null=True, write_only=True)
    picture_thumbnail = serializers.ImageField(read_only=True)

    class Meta:
        model = Album
        fields = '__all__'

    def create(self, validated_data):
        musician_data = validated_data.pop('musician')
        musician, created = Musician.objects.get_or_create(user=self.context['request'].user,
                                                           name=musician_data['name'])
        album = Album.objects.create(musician=musician,  **validated_data)
        return album

    def update(self, instance, validated_data):
        pass


class TrackSerializer(ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault(),
    )
    album = AlbumSerializer()
    musician = MusicianSerializer(read_only=True)
    upload = serializers.FileField(allow_null=True)
    download = serializers.FileField(allow_null=True, read_only=True)
    b2_file_id = serializers.CharField(read_only=True)

    class Meta:
        model = Track
        fields = '__all__'

    def create(self, validated_data):
        album_data = validated_data.pop('album')
        musician_data = album_data['musician']['name']
        musician, created = Musician.objects.get_or_create(user=self.context['request'].user,
                                                           name=musician_data)
        album, created = Album.objects.get_or_create(user=self.context['request'].user,
                                                     name=album_data['name'])
        track = Track.objects.create(album=album, musician=musician, **validated_data)
        return track

однако я могу создать новый объект из браузера DRF api.

1 Ответ

0 голосов
/ 26 сентября 2018

Я думаю, что JSON.stringify() является виновником.Он преобразует объект JSON в строку перед отправкой в ​​API.

Итак, измените

formData.append('album', JSON.stringify(album));

на

formData.append('album', album);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...