2017-02-12 54 views
0

我在DRF中保存了以下字段。發佈到Django Rest Framework時排除一些字段

  1. 生物
  2. 網站
  3. PHONENO
  4. 性別
  5. 阿凡達

我使用的反應母語作爲前端。在更新用戶配置文件時,我只想將更改發佈到服務器上。但是,在發佈到其餘api時,必須發佈formData中的所有值(包括頭像),並且由於頭像未更改,因此我試圖通過現有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

如果你正在使用的模型從Django中,那麼你需要改變東西

s 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用戶模型的一對一字段。我已將它添加到問題檢查出來... – blaziken105

0

如果你想化身字段設置爲只讀,你有兩個選擇。

選項1

,可以確保由@Ruben

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

選項2

說如果該字段存儲的字符串表示的ImageField的不需要該圖像,你打算在前端解析它,然後你可以簡單地使化身爲ReadOnlyField

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

    class Meta: 
     model = Profile 
     fields = '__all__' 
相關問題