Tôi có một mô hình trông giống như:Thêm trường để Django ModelForm mà không phải là trong mô hình
class MySchedule(models.Model):
start_datetime=models.DateTimeField()
name=models.CharField('Name',max_length=75)
Với nói ModelForm của nó:
class MyScheduleForm(forms.ModelForm):
startdate=forms.DateField()
starthour=forms.ChoiceField(choices=((6,"6am"),(7,"7am"),(8,"8am"),(9,"9am"),(10,"10am"),(11,"11am"),
(12,"noon"),(13,"1pm"),(14,"2pm"),(15,"3pm"),(16,"4pm"),(17,"5pm"),
(18,"6pm"
startminute=forms.ChoiceField(choices=((0,":00"),(15,":15"),(30,":30"),(45,":45")))),(19,"7pm"),(20,"8pm"),(21,"9pm"),(22,"10pm"),(23,"11pm")))
class Meta:
model=MySchedule
def clean(self):
starttime=time(int(self.cleaned_data.get('starthour')),int(self.cleaned_data.get('startminute')))
return self.cleaned_data
try:
self.instance.start_datetime=datetime.combine(self.cleaned_data.get("startdate"),starttime)
except TypeError:
raise forms.ValidationError("There's a problem with your start or end date")
Về cơ bản, tôi đang cố gắng để phá vỡ trường DateTime trong mô hình thành 3 trường biểu mẫu có thể sử dụng dễ dàng hơn - bộ chọn ngày, danh sách thả xuống một giờ và menu thả xuống một phút. Sau đó, một khi tôi đã nhận được ba đầu vào, tôi tập hợp lại chúng thành một DateTime và lưu nó vào mô hình.
Một số câu hỏi:
1) Đây có phải là cách sai lầm để thực hiện? Tôi không muốn tạo ra các trường trong mô hình cho giờ, phút, vv, vì đó là tất cả về cơ bản chỉ là dữ liệu trung gian, vì vậy tôi muốn một cách để phá vỡ trường DateTime thành các trường con.
2) Khó khăn mà tôi đang gặp phải là khi trường bắt đầu trống - có vẻ như nó không bao giờ được kiểm tra không trống và chỉ kết thúc bằng cách ném lên một TypeError sau khi chương trình mong đợi một ngày và được Không. Django kiểm tra đầu vào trống ở đâu và tăng lỗi cuối cùng quay trở lại biểu mẫu? Đây có phải là trách nhiệm của tôi không? Nếu vậy, làm thế nào để tôi làm điều đó, vì nó không đánh giá clean_startdate() kể từ khi startdate không có trong mô hình.
3) Có cách nào tốt hơn để thực hiện việc này với kế thừa không? Có lẽ kế thừa MyScheduleForm trong BetterScheduleForm và thêm các trường ở đó? Làm thế nào tôi sẽ làm điều này? (Tôi đã chơi đùa với nó trong hơn một giờ và dường như không thể có được nó)
Cảm ơn!
[Edit:] Còn lại ngoài khơi self.cleaned_data trở lại - mất nó trong sao chép/dán ban đầu
Nói chung, ModelForm có thể chứa bất kỳ trường nào bạn muốn. Nó giống như một Form bình thường trong vấn đề đó. Mối quan tâm duy nhất là bạn sẽ cần phải thực hiện dữ liệu ban đầu, các phương thức clean() thích hợp và phương thức save() thích hợp nếu các trường đó không tồn tại trong mô hình, vì ModelForm cố gắng tạo ra những thứ tự động sử dụng một cách kỳ diệu ngươi mâu. Yêu cầu – Cerin