2012-09-12 12 views
24

w moim modeli Django I stworzyły pole dziesiętną tak:Pozostawić tylko dodatnie liczby dziesiętne

price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12) 

Oczywiście nie ma sensu za cenę będzie ujemny lub zerowy. Czy istnieje sposób na ograniczenie liczby dziesiętnej tylko do liczb dodatnich?

Czy muszę to przechwytywać, korzystając z formularza sprawdzania poprawności?

Odpowiedz

49

Użyj MinValueValidator.

price = models.DecimalField(_(u'Price'), decimal_places=2, max_digits=12, validators=[MinValueValidator(Decimal('0.01'))]) 
+0

Albo można po prostu dodać 'MIN_VALUE = Decimal ('0,01')' – Martin

+4

który pracuje dla pól formularzy, ale nie testowałem 'MIN_VALUE = Decimal ('0,01')' dla pola modelu. Nie jest opisana w [model pola Dokumenty] (https://docs.djangoproject.com/en/1.7/ref/models/fields/). – Alasdair

+0

stoję poprawione. Mój komentarz odpowiada na ostatnie pytanie dotyczące sprawdzania poprawności formularza. 'min_value' nie działa na models.DecimalField. – Martin

0

Można zrobić coś takiego:

# ..... 
class priceForm(ModelForm): 
    price = forms.DecimalField(required=False, max_digits=6, min_value=0) 

To również jest odpowiedzialni za wartość weryfikatorów z „ceną”

0

według docs, wydaje się, że nie ma mowy wstawić coś na kształt ograniczenia bazy danych na polu. Najlepsze, co możesz zrobić, to dodać model "walidatory", który zostanie wywołany, jeśli zadzwonisz do sprawdzania poprawności modelu lub użyjesz ModelForm. Walidatory są pomijane, jeśli po prostu wstawisz wartości do obiektu i save().

Można więc dodać sprawdzanie poprawności do formularzy lub można dodać sprawdzanie poprawności do modelu, które również zostanie uruchomione na poziomie formularza, jeśli używasz ModelForm.

Z docs on "How validators are run":

Zobacz form validation uzyskać więcej informacji na temat zatwierdzające są prowadzone w formach i Validating objects na jak oni działają w modelach. Uwaga Walidatory że nie będą uruchamiane automatycznie podczas zapisywania modelu ale jeśli używasz ModelForm, to będzie działać na wszystkich swoich weryfikatorów dziedzinach, które są zawarte w formularzu. Zobacz ModelForm documentation , aby dowiedzieć się, w jaki sposób sprawdzanie poprawności modelu współdziała z formularzami.

+0

Spot na. Jeśli chcesz, aby to sprawdzanie poprawności było uruchamiane podczas tworzenia obiektu w db. Przesłonić 'save()' Metoda modelu uruchomić 'self.full_clean()' – surfer190

Powiązane problemy