मैं एक मॉडल है कि दिखता है में नहीं हैं Django ModelForm लिए फ़ील्ड जोड़ें की तरह:, मैं कोशिश कर रहा हूँकि मॉडल
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")
असल:
class MySchedule(models.Model):
start_datetime=models.DateTimeField()
name=models.CharField('Name',max_length=75)
इसके साथ इसकी ModelForm आता है मॉडल में डेटटाइम फ़ील्ड को 3 और आसानी से उपयोग करने योग्य फॉर्म फ़ील्ड में विभाजित करें - एक दिनांक पिकर, एक घंटा ड्रॉपडाउन, और एक मिनट ड्रॉपडाउन। फिर, एक बार जब मैं तीन इनपुट प्राप्त कर लेता हूं, तो मैं उन्हें डेटटाइम में पुनः इकट्ठा करता हूं और इसे मॉडल में सहेजता हूं।
कुछ सवाल:
1) इस पूरी तरह से गलत यह करने के बारे में जाने के लिए रास्ता नहीं है? मैं मॉडल में घंटों, मिनटों, आदि के लिए फ़ील्ड बनाना नहीं चाहता हूं, क्योंकि यह मूल रूप से केवल मध्यस्थ डेटा है, इसलिए मैं डेटटाइम फ़ील्ड को उप-फ़ील्ड में तोड़ने का एक तरीका चाहूंगा।
2) जिस कठिनाई में मैं दौड़ रहा हूं वह तब होता है जब स्टार्टडेट फ़ील्ड रिक्त होता है - ऐसा लगता है कि यह गैर-खालीता के लिए कभी भी चेक नहीं किया जाता है, और जब प्रोग्राम किसी दिनांक की अपेक्षा करता है तो बाद में टाइपरर को फेंकना समाप्त होता है और कोई नहीं मिलता है। Django रिक्त इनपुट के लिए कहां जांचता है, और अंत में फार्म पर वापस जाने वाली त्रुटि को बढ़ाता है? क्या यह मेरी ज़िम्मेदारी है? यदि हां, तो मैं इसे कैसे कर सकता हूं, क्योंकि यह clean_startdate() का मूल्यांकन नहीं करता है क्योंकि स्टार्टडेट मॉडल में नहीं है।
3) क्या विरासत के साथ ऐसा करने का कोई बेहतर तरीका है? शायद BetterScheduleForm में MyScheduleForm का उत्तराधिकारी है और वहां फ़ील्ड जोड़ें? यह मैं कैसे करूंगा? (मैं इसके साथ घंटों तक खेल रहा हूं और इसे प्राप्त नहीं कर सकता)
धन्यवाद!
[संपादित करें:] वापसी self.cleaned_data छोड़ा था - कॉपी/पेस्ट में यह खो मूल रूप
सामान्य रूप से, मॉडलफॉर्म में जो भी फ़ील्ड आप चाहते हैं वह हो सकती है। यह उस संबंध में एक सामान्य रूप की तरह है। एकमात्र चिंता यह है कि आपको प्रारंभिक डेटा, उचित साफ() विधियों और उपयुक्त सहेजने() विधि को लागू करने की आवश्यकता होगी यदि उन फ़ील्ड मॉडल में मौजूद नहीं हैं, क्योंकि मॉडलफॉर्म उन चीज़ों को स्वचालित रूप से उपयोग करने का प्रयास करता है आदर्श। – Cerin