2009-09-17 35 views
6

Tôi đã một mô hình như thế này với Django 1.1:Mô hình.CharField ('blank = False') có hoạt động với save() không?

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

Theo mặc định, tôi đang đọc rằng cả hai 'null' và 'trống' là False.

Vì vậy, với một thử nghiệm như thế này ...

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

... tôi mong đợi những tiết kiệm để ném một ngoại lệ. Nhưng nó không. Có vẻ như khá vui khi tạo một bản ghi mới với một tên trống (Postgres và SQLite3).

Tôi lưu ý rằng thông qua giao diện quản trị, lưu thực sự không thành công với "trường này là bắt buộc".

Câu hỏi là:

  1. Là 'trống' thuộc tính chỉ được áp dụng bởi các hình thức?
  2. Khắc phục để ghi đè phương thức save() và kiểm tra rõ ràng rằng len (name)! = 0?
  3. Tôi đã hiểu nhầm điều gì đó mà một khi đã hiểu được giải quyết sự hiểu lầm của tôi?
+0

Câu trả lời cho tiêu đề là "Không". Dường như thực tế phổ biến là giả định dữ liệu hợp lệ ở mô hình và ủy thác xác thực cho biểu mẫu. –

+0

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

Trả lời

5

UPDATE: Xem model validation documentation trong các phiên bản gần đây Django.

Câu trả lời gốc: blank=True/False only applies to forms. Xác thực dữ liệu hiện chỉ xảy ra ở cấp biểu mẫu; điều này sẽ thay đổi khi model-validation Google Summer of Code work được hợp nhất vào thân cây.

Loại xác thực duy nhất hiện đang xảy ra ở lớp mô hình là bất kỳ lỗi nào mà phần phụ trợ cơ sở dữ liệu của bạn sẽ ném nếu nó không thể xử lý những gì nó nhận được. Trong trường hợp của một CharField trống bạn sẽ thường không bao giờ nhận được lỗi từ cơ sở dữ liệu, như Django đặt trường vào một chuỗi rỗng theo mặc định.

Hiện tại, bạn nên sử dụng phương thức save() cho bất kỳ xác thực cấp mô hình nào bạn muốn. Ngay sau đó (nếu bạn đang ở trên thân cây) hoặc khi 1.2 xuất hiện, hãy sử dụng công cụ xác thực mẫu.

+1

Điều này có vẻ như một câu trả lời cũ, nhưng câu hỏi dường như vẫn có liên quan? Điều gì đã từng xảy ra ở đây? – Lucretiel

+0

Một chủ đề gần đây hơn: https://stackoverflow.com/questions/17816229 – texnic

1

Từ Django Docs:

"Lưu ý rằng giá trị chuỗi rỗng sẽ luôn được lưu trữ như là chuỗi rỗng, không phải là NULL Chỉ sử dụng null = True cho lĩnh vực phi chuỗi như số nguyên, boolean và ngày tháng.. "

Mã của bạn đang lưu trữ một chuỗi trống.

Để minh họa điều này, hãy thử:

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

Đúng, nhưng không trả lời câu hỏi được yêu cầu. –

+3

Có nó thực sự là lưu trữ một chuỗi rỗng. Đó chính là vấn đề. Khi 'trống' được đặt thành 'False', tôi đã mong đợi nó sẽ ngăn chặn điều đó. –

Các vấn đề liên quan