سؤال

السؤال:كيفية كتابة التعليمات البرمجية الجافة للتحقق من صحة الحقل في كل من الشكل والمسلسل?

مثال:لدي التطبيق جانغو بسيط مع نموذج النموذج ، الذي يتحقق من صحة passengers مجال ل Order:

def clean_passengers(self):
    passengers = self.cleaned_data['passengers']
    if passengers > self.flight.available_seats:
        raise forms.ValidationError(
            _(u'''Passengers count can`t be greater then seats count'''))
    return passengers

ونفس الرمز للتحقق في Order مسلسل:

def validate_passengers(self, attrs, source):
    passengers = attrs[source]
    if passengers > self.flight.available_seats:
        raise serializers.ValidationError(
            _(u'''Passengers count can`t be greater then seats count'''))
    return attrs

هذا ليس جافا وقد كتبت نفس المنطق مرتين.كيف يمكنني تجنب هذا?ربما يمكنني أن أرث المسلسل من النموذج أو شيء من هذا القبيل.

هل كانت مفيدة؟

المحلول

يمكنك استخدام المسلسل الخاص بك لإلغاء تسلسل والتحقق من صحة البيانات داخل is_valid طريقة النموذج الخاص بك.

class MyModelForm(ModelForm):
    def is_valid(self):
        # Call super's is_valid to populate cleaned_data and do basic field validation
        valid = super(MyModelForm, self).is_valid()
        if not valid:
            return False

        serializer = MyModelSerializer(data=self.cleaned_data)
        return serializer.is_valid()

نصائح أخرى

هنا بلدي تنفيذ فئة التحقق من صحة قابلة لإعادة الاستخدام لنماذج النموذج.جميع الأشياء جانغو الأصلية هنا باستثناء إعادة كتابة get_serializer الطريقة.التحقق من حالة العمل مع جانغو 1.8.13.

class RestFrameworkValidationModelForm(forms.ModelForm):
    serializer_class = None

    def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer()` method."
            % self.__class__.__name__
        )

        return self.serializer_class(*args, **kwargs)

    def is_valid(self):
        if super(RestFrameworkValidationModelForm, self).is_valid():
            serializer = self.get_serializer(data=self.cleaned_data)
            valid = serializer.is_valid()
            self.add_error(None, serializer.errors)
            return valid
        return False

وهنا مثال على الاستخدام:

class ExperimentForm(RestFrameworkValidationModelForm):
    serializer_class = ExperimentSerializer

    class Meta:
        model = Experiment
        exclude = []

أود أن أقترح وضع كل التحقق من الصحة (عندما يكون ذلك ممكنا) في النموذج (المدققون أو clean).

ModelForm و ModelSerializer ثم استخدم الوضع-التحقق من الصحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top