2014-05-19 27 views
5

Szukam sposobu ograniczenia FloatField w Django do 2 miejsc po przecinku. Ktoś ma pojęcie o tym, jak można to zrobić bez konieczności używania DecimalField.Ograniczanie django FloatField do 2 miejsc po przecinku

Próbowałem decimal_places=2, ale to tylko daje mi błąd migracji w polu float, więc myślę, że ta metoda musi działać tylko w DecimalFields.

+0

Dlaczego nie chcesz użyć 'DecimalField'? – alecxe

+0

próbowałeś tego 'models.FloatField (default = to_some_value)' – ajkumar25

+0

ponieważ pola dziesiętne dodają strzały inkrementacji i dekrementacji w polu wejściowym i nie chcę, żeby się pojawiły, nie próbowałem domyślnej metody, lecz sprawdzę ją i zobaczę jeśli ma prawo do tego, czego potrzebuję. –

Odpowiedz

11

Jeśli interesuje Cię tylko sposób wyświetlania FloatField w formularzach, możesz użyć filtru szablonu floatformat.

Z Django Docs:

Jeśli używany z numerycznym całkowitą argumentu floatformat zaokrągla liczbę do tego wielu miejsc po przecinku.

Na przykład, jeśli wartość = 34,23234, następnie w szablonie:

{{ value|floatformat:2 }} # outputs 34.23 
+0

To dobrze, ale nie jest całkowicie to, czego szukam, ale jestem pewien, że to przyda się w przyszłych projektach dzięki za pomoc . –

+0

To pomaga. Używam Postgres z Django 'FloatField (domyślnie = 0.00)' ale zapisuję go jako '0', usuwając niepotrzebne' 0s' w miejscach dziesiętnych .. co ma sens ... ale chcę pokazać stałe wartości '0.00' lub' 5.43' w szablonie ... '{{value | floatformat: 2}}' did the trick –

+0

Zobacz mój [odpowiedź] (https://stackoverflow.com/questions/23739030/restrict-django-floatfield-to-2- decimal-places/46081058 # 46081058) dla zapewnienia, że ​​twoje pole danych zawsze zaokrągla do dwóch miejsc po przecinku na poziomie bazy danych. –

0

Ponieważ Django 1.8+ można używać niestandardowych walidatora dla FloatField/lub jakiekolwiek ModelFields:

def validate_decimals(value): 
    try: 
     return round(float(value), 2) 
    except: 
     raise ValidationError(
      _('%(value)s is not an integer or a float number'), 
      params={'value': value}, 
     ) 

... i w swoim modelu możesz go zastosować tak:

from django.db import models 

class MyModel(models.Model): 
    even_field = models.FloatField(validators=[validate_decimals]) 
+0

To nie zadziała. Validators nie zmieniają wartości, które są zapisywane, tylko sprawdzają, czy wartość jest akceptowalna. Jeśli wartość jest nie do przyjęcia, należy podnieść wyjątek. Nie zmieni to wartości, która jest zapisywana. –

+0

Zobacz poniżej odpowiedź, która zapewni, że pole float zaokrągli do dwóch miejsc po przecinku. –

3

Jeśli chcesz mieć pewność, że model będzie zawsze zapisywany z dwoma miejscami po przecinku, a nie tylko zmienisz prezentację modelu w szablonie, niestandardowa metoda zapisywania w modelu będzie działać świetnie. Poniższy przykładowy model pokazuje, jak.

class MyDataModel(models.Model): 
    my_float = models.FloatField() 

    def save(self, *args, **kwargs): 
     self.my_float = round(self.my_float, 2) 
     super(MyDataModel, self).save(*args, **kwargs) 

Teraz za każdym razem, gdy zapiszesz model, zagwarantujesz, że pole zostanie wypełnione tylko zmiennoprzecinkowym dwoma miejscami po przecinku. Można to uogólnić na zaokrąglanie do dowolnej liczby miejsc po przecinku.