2015-09-04 11 views
0

我正在使用rest框架來序列化我的數據,並且我創建了一個序列化程序,如下所示,但是當我填寫表單併發送它時,它會發送但我的數據即使沒有一個錯誤也不會改變!而空白字段仍然保持空白而不會改變!我該怎麼辦?REST框架放入數據但不更改它們

enter image description here

Serializer.py:

class UserProfileSignUpSerializer(serializers.ModelSerializer): 
    verification_code = serializers.ReadOnlyField(read_only=True) 

    class Meta: 
     model = UserProfile 
     fields = ['id', 'gender', 'birthday', 'country', 'city', 'street_address', 'state', 'about', 'social_links', 
        'location', 'avatar', 'verification_code'] 


class UserSignUpSerializer(serializers.ModelSerializer): 
    user_profile = UserProfileSignUpSerializer() 

    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'username', 'user_profile') 

    def update(self, instance, validated_data): 
     user_profile_data = validated_data.pop('user_profile') 
     for attr, value in user_profile_data.items(): 
      setattr(instance, attr, value) 
     for attr, value in validated_data.items(): 
      setattr(instance.user_profile, attr, value) 
     # UserProfile.objects.create(user=instance, **user_profile_data) 
     instance.save() 
     instance.user_profile.save() 
     return instance 

Views.py:

class UserSignupDetail(generics.RetrieveUpdateAPIView): 
    serializer_class = UserSignUpSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly,) 

    def get_queryset(self): 
     pk = self.kwargs['pk'] 
     signup = User.objects.filter(pk=pk) 
     return signup 

Permission.py:

該文件指定的權限級別僅只是老闆可以編輯對象。

class IsOwnerOrReadOnly(permissions.BasePermission): 
    """ 
    Custom permission to only allow owners of an object to edit it. 
    """ 

    def has_object_permission(self, request, view, obj): 
     # Read permissions are allowed to any request, 
     # so we'll always allow GET, HEAD or OPTIONS requests. 


     return obj.username == request.user.username 

我這裏有一個模型,檔案,其中存在的一些對象,並提出了一對一的對應auth.User;和一個名爲Userprofile的子類。

Model.py

class Profile(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    avatar = models.ImageField(blank=True, upload_to=get_image_path) 
    street_address = models.CharField(max_length=100, blank=True) 
    city = models.CharField(max_length=100, blank=True) 
    state = models.CharField(max_length=100, blank=True) 
    country = models.CharField(max_length=100, blank=True) 
    persian_address = models.CharField(max_length=100, blank=True) 
    about = models.TextField(max_length=100, blank=True) 
    social_links = models.TextField(blank=True) 
    update = models.DateTimeField(auto_now=True) 
    timestamp = models.DateTimeField(auto_now_add=True) 
    location = GeopositionField() 


# User Profile 
class UserProfile(Profile): 
    user = models.OneToOneField(User, related_name='user_profile') 
    gender = models.CharField(choices=sex, max_length=1) 
    birthday = models.DateField(blank=True, null=True) 
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,11}$', message="Phone number must be entered in the format: " 
                    "'9123456789'. Up to 15 digits allowed.") 
    call_no = models.CharField(validators=[phone_regex], max_length=15, blank=False, default='9123456789') 
    verification_code = models.CharField(default=generator(4), max_length=5, blank=False) 
    is_verified = models.BooleanField(default=False) 

回答

0

你檢查使用 'POST' 嘗試。還要確保表單沒有與舊數據一起緩存,我自己也有這個問題。

+0

我必須使用「把」因爲我想更新的信息,但我怎麼能'還要確保形式沒有與舊數據緩存? – altruistic

+0

如果你的意思是在瀏覽器中,我多次點擊F5,但沒有改變! – altruistic

+0

一個簡單的方法是獲取表單並添加一些隨機查詢字符串編號,以便知道get返回新值。所以如果它是'GET user/userid = 12345',則將其更改爲'GET user/userid = 12345&rnd = 23048290' –

0

我改變了我的serializer.py以下,它的工作原理確定:

class UserSignUpSerializer(serializers.ModelSerializer): 
    user_profile = UserProfileSignUpSerializer() 

    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'username', 'user_profile') 

    def update(self, instance, validated_data): 
     user_profile_data = validated_data.pop('user_profile') 

     for attr, value in validated_data.items(): 
      setattr(instance, attr, value) 

     instance.save() 
     try: 
      UserProfile.objects.get(user=instance) 
      for attr, value in user_profile_data.items(): 
       setattr(instance.user_profile, attr, value) 
     except ObjectDoesNotExist: 
      UserProfile.objects.create(user=instance, **user_profile_data) 
     instance.user_profile.save() 
     return instance 
相關問題