2009-09-17 20 views
6

Mam modelu jak ten z Django 1.1:Czy model.CharField ("blank = False") działa z save()?

class Booking(models.Model): 
    name = models.CharField(max_length=100) 

Domyślnie Czytam, że zarówno „zerowy” i „puste” są fałszywe.

Więc z testu jak to ...

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.save() 

... Spodziewałem ustawiony rzucić wyjątek. Ale tak nie jest. Wydaje się całkiem szczęśliwy tworzenie nowego rekordu z pustą nazwą (Postgres i SQLite3).

Zauważam, że poprzez interfejs administratora zapisywanie rzeczywiście kończy się niepowodzeniem z "to pole jest wymagane".

Pytania są następujące:

  1. jest 'pusty' atrybut stosowane jedynie przez formy?
  2. Czy poprawka ma zastąpić metodę save() i jawnie sprawdzić, czy len (name)! = 0?
  3. Czy źle zrozumiałem coś, co kiedyś zrozumiało moje nieporozumienie?
+0

Odpowiedzią na tytuł jest "Nie". Wydaje się, że powszechną praktyką jest przyjmowanie prawidłowych danych w modelu i zatwierdzanie formularza. –

+0

http://stackoverflow.com/questions/6940499/how-can-you-create-a-non-empty-charfield-in-django –

Odpowiedz

5

UPDATE: Zobacz model validation documentation w ostatnich wersji Django.

Oryginalna odpowiedź: blank=True/False only applies to forms. Sprawdzanie danych odbywa się obecnie tylko na poziomie formularza; to się zmieni, gdy model-validation Google Summer of Code work zostanie scalony w trunk.

Jedynym rodzajem sprawdzania poprawności, który obecnie zachodzi w warstwie modelu, są wszelkie błędy, które spowalnia backend bazy danych, jeśli nie jest w stanie obsłużyć tego, co otrzyma. W przypadku pustego pola CharField generalnie nigdy nie otrzymasz błędów z bazy danych, ponieważ Django domyślnie ustawia pole na pusty łańcuch.

Na razie należy użyć metody save() dla dowolnej walidacji na poziomie modelu. Wkrótce (jeśli jesteś na bagażniku) lub gdy wyjdzie 1.2, użyj rzeczy sprawdzania poprawności modelu.

+1

Wydaje się, że to stara odpowiedź, ale pytanie wydaje się nadal aktualne? Co się tutaj stało? – Lucretiel

+0

Nowszy wątek: https://stackoverflow.com/questions/17816229 – texnic

1

Z Django Docs:

„Zauważ, że puste wartości ciągu będzie się zawsze przechowywane jako pustych strun, a nie jako NULL używać wyłącznie wartość null = True dla pól non-strunowych, takich jak liczby całkowite, logicznych i dat.. "

Twój kod zapisuje pusty ciąg.

Aby to zilustrować, spróbuj:

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.name = None 
     b.save() 
+0

To prawda, ale nie odpowiada na zadane pytanie. –

+3

Tak, rzeczywiście zapisuje pusty ciąg znaków. To jest problem. Ponieważ "puste" jest ustawione na "Fałsz", spodziewałem się, że to uniemożliwi. –

Powiązane problemy