2015-12-02 12 views
7

Bir modelin yeni bir örneğini oluşturmak için CreateAPIView'a gönderilen bir iletişim formum var (bu, yöneticiye e-postayla gönderilir) . Diziselleştiricimde spam'i reddetmek için bir bal küpü alanım var.DRF: Doğrulamadan sonra model oluşturucudaki alanı kaldır ancak yaratılmadan önce (CreateAPIView'de)

modeli:

class Message(models.Model): 
    name = ... 
    message = ... 

ve seri hale:

class MessageSerializer(serializers.ModelSerializer): 

    # Honeypot field 
    url = serializers.CharField(allow_blank=True, required=False) 

    class Meta: 
     model = Message 
     fields = '__all__' 

    def validate_url(self, value): 
     if value and len(value) > 0: 
      raise serializers.ValidationError('Spam') 
     return value 

ve görünüm:

class MessageView(generics.CreateAPIView): 
    ''' Create a new contact form message. ''' 
    serializer_class = MessageSerializer 

Benim sorun olduğunu şimdiki haliyle bu görüşe yüklerken, ben hatayı alın:

210 öylesine besbelli seriazlier ben serileştirici alanına read_only ekleyerek çalıştı CreateApiView.perform_create()

yılında modele url alanını kurtarmaya çalışıyor, ancak bu url_validate yöntem olduğu gibi atlanır anlamına gelir.

Doğrulama gerçekleşene kadar alanı serializer üzerinde nasıl tutabilirim, serializer.save()perform_create() içinde çağrılmadan önce onu nasıl kaldırabilirim?

cevap

5

böyle oluşturmak yöntemi geçersiz kılmasını yapabilirsiniz:

class MessageSerializer(serializers.ModelSerializer): 

    # Honeypot field 
    url = serializers.CharField(allow_blank=True, required=False) 

    class Meta: 
     model = Message 
     fields = '__all__' 

    def validate_url(self, value): 
     if value and len(value) > 0: 
      raise serializers.ValidationError('Spam') 
     return value 

    def create(self, validated_data): 
     data = validated_data.pop('url') 
     return Message.objects.create(**data) 
+0

Ha, ben bunu anladım ve senin yaptığın tam olarak yayınlanmıştır. –

+2

puanına sahip olabilirsiniz, ancak cevabınız için teşekkür ederiz, ancak 'Message.objects.create (** data)' yanlıştır 'validated_data' yerine "Message.objects.create (** validated_data)" demek yerine – shotgunner

0

OK, Ben doğru hatayı okumadım. Açıkça söylediği gibi:

override the MessageSerializer.create() method to handle this correctly.

ben mantıklı gelmedi CreateAPIView.create() yöntemi üzerine yazarak bakıyordu.

Bu çalışır:

class MessageSerializer(serializers.ModelSerializer): 

    # Honeypot field 
    url = serializers.CharField(allow_blank=True, required=False) 

    class Meta: 
     model = Message 
     fields = '__all__' 

    def validate_url(self, value): 

     if value and len(value) > 0: 
      raise serializers.ValidationError('Error') 
     return value 

    def create(self, validated_data): 
     if "url" in validated_data: 
      del validated_data["url"] 
     return Message.objects.create(**validated_data) 
İlgili konular