2011-05-10 39 views
6

i am novice tại django development. tôi đang tạo lớp A có thể có nhiều lớp B được gán cho nó:django 'DateTimeField' không có lỗi giá trị mặc định

class A(models.Model):   
    name = models.CharField(max_length=200)  

    def __unicode__(self): 
     self.name 


class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date') 

Khi tôi đang cố gắng tạo thành phần "A" mới trên trang quản trị và tạo phần tử B phù hợp cho nó rồi save(), tôi đang nhận được Cảnh báo: Dòng 'mydate' không có một giá trị mặc định

Nếu tôi di chuyển "mydate", yếu tố để lớp A, sau đó khi đánh save() tôi đang nhận được một thông này lĩnh vực này là yêu cầu từ Django, đòi hỏi tôi phải điền vào lĩnh vực này!

làm cách nào tôi có thể thực hiện thông báo bắt buộc này cũng xuất hiện khi trường ngày là một phần của B !!!

Cảm ơn

+0

Bạn cần phải thêm chi tiết hơn cho một câu trả lời tốt ở đây. Làm thế nào bạn "tạo ra một phần tử phù hợp B"? Nó được thực hiện trong phương thức 'save' của' A', như một phần của tín hiệu 'post_save', hay bạn đang định truy cập vào trang add/change admin cho' B' và làm nó từ đó? Tùy thuộc vào phương pháp nào, câu trả lời cho câu hỏi của bạn có thể cực kỳ khác nhau. –

+0

vâng tôi đã cố gắng thực hiện điều này thông qua phần tử A()! Tôi không biết post_save là gì, tuy nhiên tôi giả định nó được gọi cho mỗi B i tiết kiệm cùng với A – sramij

Trả lời

12

Nếu bạn chưa chỉ định, trường của bạn là tùy chọn, bạn sẽ phải cung cấp giá trị cho trường đó mỗi khi bạn tạo đối tượng. Trong trường hợp của bạn, bạn có thể không, do đó bạn sẽ phải làm một trong những điều:

Sau đây là cách để làm cho trường tuỳ chọn:

class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', blank=True, null=True) 

Đây là cách bạn thiết lập giá trị mặc định:

import datetime 

class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', default=datetime.datetime.now) 
+0

tôi đã phải di chuyển đến sqlit cũng để làm cho nó hoạt động! aditionaly để u'r đề xuất – sramij

+0

@ sramij, không cần phải thay đổi công cụ DB, bạn chỉ cần tạo lại cơ sở dữ liệu bằng 'suncdb'. –

0

Từ hiểu biết của tôi, django sẽ thử xác thực mô hình A và sau đó trả về lỗi xác thực. Kể từ khi A xác nhận, nó cố gắng để viết A mà không thành công kể từ khi B không xác nhận hợp lệ. Tôi không chắc chắn làm thế nào để làm điều này một cách thanh lịch, nhưng nếu bạn cố gắng đánh giá mẫu B của riêng mình trước khi xác nhận A bạn sẽ nhận được thông báo "trường này là bắt buộc" mà sau đó bạn có thể hiển thị cho người dùng.

4

Có một chức năng hữu ích trong Django

from django.utils import timezone 
class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', default=timezone.now) 

Chức năng này sẽ đưa bạn trở một đối tượng datetime dựa trên USE_TZ trong settings.py

def now(): 
    """ 
    Returns an aware or naive datetime.datetime, depending on settings.USE_TZ. 
    """ 
    if settings.USE_TZ: 
     # timeit shows that datetime.now(tz=utc) is 24% slower 
     return datetime.utcnow().replace(tzinfo=utc) 
    else: 
     return datetime.now() 
Các vấn đề liên quan