2017-02-12 2 views
0

私は自分のDRFに以下のフィールドを保存しました。Django Rest Frameworkへの投稿中にいくつかのフィールドを除外

  1. バイオ
  2. サイト
  3. PHONENO
  4. 性別
  5. アバター

私が反応し、ネイティブのフロントエンドとして使用しています。ユーザープロフィールを更新している間、私は変更をサーバーに投稿したいだけです。しかし、残りのAPIに投稿するときは、フォームデータにすべての値を投稿する必要があります。アバターは変更されていないので、 uriは動作していないようです。 別のシリアライザを作成し、PUTを使ってデータをサーバーに渡してみましたが、どちらも動作しませんでした。私はエラーを取得し続けます。

「詳細」:「マルチパートフォーム解析エラー - マルチパートの無効な境界:なし」渡されたURIが有効ではありませんので、私は推測

はおそらくありません。私もシリアライザでget_validation_exclusions()メソッドを使用しようとしましたが、どちらも動作しません。変更された他のすべてのフィールドを更新する際に、アバターの投稿をオプションにするにはどうすればよいですか?

views.py

class ProfileView(APIView): 
serializer_class = ProfileSerializer 
def get(self, request, format=None): 
    snippets = Profile.objects.filter(pk=request.user.id) 
    serializer = ProfileSerializer(snippets, many=True) 
    return Response(serializer.data) 

def post(self, request, format=None): 
    serializer = ProfileSerializer(data=request.data) 
    if serializer.is_valid(): 
     user= User.objects.get(pk=request.user.id) 
     user.profile.bio=request.data["bio"] 
     user.profile.website=request.data["website"] 
     user.profile.gender=request.data["gender"] 
     user.profile.phoneno=request.data["phoneno"] 
     user.profile.avatar=request.data["avatar"] 
     user.profile.save() 
     user.save() 
     return Response(serializer.data,status=status.HTTP_201_CREATED) 
    else: 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

def put(self, request, format=None): 
    snippet = User.objects.filter(pk=request.user.id) 
    serializer = ChangeProfileSeralizer(snippet, data=request.data) 
    if serializer.is_valid(): 
     user= User.objects.get(pk=request.user.id) 
     user.profile.bio=request.data["bio"] 
     user.profile.website=request.data["website"] 
     user.profile.gender=request.data["gender"] 
     user.profile.phoneno=request.data["phoneno"] 
     user.profile.save() 
     return Response(serializer.data, status=status.HTTP_200_OK) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

serializers.py

class ChangeProfileSeralizer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Profile 
     fields = ('website', 'phoneno','gender','bio') 

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    avatar=serializers.ImageField(max_length=None,use_url=True) 
    website = serializers.CharField(required=False) 
    phoneno = serializers.CharField(required=False) 
    gender = serializers.CharField(required=False) 
    avatar = serializers.ImageField(required=False) 

    class Meta: 
     model = Profile 
     fields = ('bio','website','phoneno','gender','avatar') 

    def get_validation_exclusions(self,instance=None): 
     exclusions = super(ProfileSerializer, self).get_validation_exclusions(instance) 
     return exclusions +['avatar'] 

編集(プロファイルモデル):

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE,primary_key=True) 
    bio = models.TextField(max_length=500, blank=True) 
    website = models.TextField(max_length=200, blank=True) 
    phoneno = models.TextField(max_length=200, blank=True) 
    gender = models.TextField(max_length=200, blank=True) 
    avatar = models.ImageField('profile picture', upload_to='images/avatar/', default='/images/avatar/blank.png') 
+0

シリアライザのアバターImageFieldに 'required = False'を設定して、リクエストを送信するときにフィールドを除外しましたか? –

答えて

1

あなたはジャンゴのモデルを使用している場合は、変更する必要があります物事

erializers.py

class ProfileSerializer(serializers.ModelSerializer): 

     class Meta: 
      model = Profile 
      exclude = ('user',) 

views.py

class ProfileView(views.ModelViewSet): 
    serializer_class = ProfileSerializer 
    queryset = Profile.objects.all() 

urls.py

router = DefaultRouter() 
router.register(r'profile', ProfileView) 

、今、あなたはそれはあなたがここに見ることができる仕組み直接

モデルへのアクセス権を持っています:

Model Serializer in DRF;

Model Viewset;

Default router

+0

同じエラーが発生しても動作しませんでした。 { "詳細": "マルチパートフォーム解析エラー - マルチパート内の無効な境界:なし" }問題が発生する可能性はありますか? – blaziken105

+0

どこからあなたのプロファイルモデルを取得していますか? –

+0

これはDjango User Modelにリンクされた1対1のフィールドです。私はそれをチェックする質問に追加しました... – blaziken105

0

あなたはアバターのフィールドは読み取り専用になりたい場合は、2つのオプションがあります。フィールドがの文字列表現を記憶している場合は、@Ruben

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    avatar = serializers.ImageField(required=False) 

オプション2

で言ったようのImageFieldが必要とされていないことを確認することができます

オプション1

画像とあなたはフロントエンドでそれを解析することを計画しているので、単にアバターをReadOnlyFieldにすることができます。

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    avatar = serializers.ReadOnlyField() 

    class Meta: 
     model = Profile 
     fields = '__all__' 
関連する問題