2015-12-02 7 views
7

मेरे पास एक साइट पर एक संपर्क फ़ॉर्म है जो CreateAPIView पर एक मॉडल का एक नया उदाहरण बनाने के लिए पोस्ट कर रहा है (जिसे अंत में व्यवस्थापक को ईमेल किया गया है) । मेरे धारावाहिक पर मेरे पास स्पैम को अस्वीकार करने में मदद करने के लिए एक हनीपॉट फ़ील्ड है।डीआरएफ: सत्यापन के बाद मॉडल सीरिएलाइज़र पर फ़ील्ड निकालें लेकिन सृजन से पहले (CreateAPIView पर)

मॉडल:

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

और serializer:

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 

और दृश्य:

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

मेरे समस्या यह है कि यह खड़ा के रूप में, जब मैं इस दृश्य के लिए पोस्ट, मैं त्रुटि प्राप्त करें:

TypeError: Got a TypeError when calling Message.objects.create() . This may be because you have a writable field on the serializer class that is not a valid argument to Message.objects.create() . You may need to make the field read-only, or override the MessageSerializer.create() method to handle this correctly.

इतनी स्पष्ट रूप से seriazlier CreateApiView.perform_create()

मैं serializer क्षेत्र के लिए read_only जोड़ने का प्रयास में मॉडल के लिए url क्षेत्र को बचाने के लिए प्रयास कर रहा है, लेकिन इसका मतलब है कि url_validate विधि पूरी तरह छोड़ दिया है।

प्रमाणीकरण होने तक मैं धारावाहिक पर फ़ील्ड कैसे रख सकता हूं, serializer.save() से पहले इसे हटाकर perform_create() में कहा जाता है?

उत्तर

5

आप इस अधिभावी की तरह विधि बनाने के कर सकते हैं:

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

हा, मैं इसे समझ से बाहर है और वास्तव में तैनात के रूप में आप से किया था। आपके पास अंक हो सकते हैं;) –

+2

आपकी प्रतिक्रिया के लिए धन्यवाद लेकिन 'Message.objects.create (** डेटा) 'गलत है, आपको' validated_data' पास करना चाहिए, मेरा मतलब है' Message.objects.create (** validated_data) ' – shotgunner

0

ठीक है, मैं सही ढंग से त्रुटि पढ़ा नहीं था। के रूप में यह स्पष्ट रूप से कहते हैं:

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

मैं CreateAPIView.create() विधि है जो मतलब नहीं था अधिलेखन देख रहा था।

यह काम करता है:

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) 
संबंधित मुद्दे