دجانغو ريست إطار مسلسلات وأشكال دجانغو
-
21-12-2019 - |
سؤال
السؤال:كيفية كتابة التعليمات البرمجية الجافة للتحقق من صحة الحقل في كل من الشكل والمسلسل?
مثال:لدي التطبيق جانغو بسيط مع نموذج النموذج ، الذي يتحقق من صحة 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
ثم استخدم الوضع-التحقق من الصحة.