2009-09-17 19 views
6

Django 1.1 ile böyle bir model var: Varsayılan olarak, ben de 'boş' ve 'boş' Yanlış olduğunu okuyorumModel.CharField ('blank = False') save() ile çalışır mı?

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

.

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

... Böyle bir test ile Yani ... bir özel durum için kaydetmek bekleniyor. Ama öyle değil. Boş bir adla (Postgres ve SQLite3) yeni bir kayıt oluşturmak oldukça mutlu görünüyor.

Yönetici arabirimi aracılığıyla bir "kaydetmenin gerekli olduğu" ile bir kayıt başarısız olur.

Sorular şunlardır:

  1. sadece formları tarafından uygulanan öznitelik 'boş' mı?
  2. Düzeltme, save() yöntemini geçersiz kılmalı ve bunu açıkça kontrol edin (isim)! = 0?
  3. Anladıktan sonra yanlış anlamalarımı gideren bir şeyi yanlış anlamış mıyım? Django Docs itibaren
+0

Başlığın yanıtı "Hayır". Modelde geçerli veriyi kabul etmenin ve form için doğrulamayı onaylamanın yaygın bir uygulama olduğunu düşünüyor. –

+0

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

cevap

5

GÜNCELLEME: son Django sürümlerinde model validation documentation bakın.

Orijinal yanıtlama: blank=True/False only applies to forms. Veri doğrulama şu anda sadece form düzeyinde gerçekleşir; Bu, model-validation Google Summer of Code work gövdeye birleştirildiğinde değişecektir.

Model katmanında şu anda gerçekleşen tek doğrulama türü, veritabanı arka ucunun ne alacağıyla baş edemiyorsa attığı hatalardır. Boş bir CharField söz konusu olduğunda, Django alanı varsayılan olarak boş bir dizeye ayarladığı için genellikle veritabanından asla hata alamazsınız.

Şimdilik, istediğiniz herhangi bir model düzeyinde doğrulama için save() yöntemini kullanmalısınız. Yakında (eğer bagajdaysanız) veya 1.2 çıktığı zaman, model doğrulama maddelerini kullanın.

+1

Bu eski bir cevap gibi görünüyor, ama soru hala alakalı görünüyor? Buraya kadar olan ne oldu? – Lucretiel

+0

Daha yeni bir konu: https://stackoverflow.com/questions/17816229 – texnic

1

:

"o boş dize değerleri Not her zaman NULL olarak, boş dize olarak saklanan alacak ancak böyle tamsayılar, Boolean ve tarih gibi olmayan dize alanları için Doğru = null kullanın.. "

Kodunuz boş bir dize saklıyor. Bunu anlamak için

, deneyin:

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

Doğru, ancak sorulan soruya cevap vermiyor. –

+3

Evet gerçekten boş bir dizgeyi saklıyor. İşte sorun bu. 'Boş' 'Yanlış' olarak ayarlandığında, bunu engellemesini beklerdim. –