2011-01-12 11 views
11

मैं एक मॉडल है कि दिखता है में नहीं हैं 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 छोड़ा था - कॉपी/पेस्ट में यह खो मूल रूप

+0

सामान्य रूप से, मॉडलफॉर्म में जो भी फ़ील्ड आप चाहते हैं वह हो सकती है। यह उस संबंध में एक सामान्य रूप की तरह है। एकमात्र चिंता यह है कि आपको प्रारंभिक डेटा, उचित साफ() विधियों और उपयुक्त सहेजने() विधि को लागू करने की आवश्यकता होगी यदि उन फ़ील्ड मॉडल में मौजूद नहीं हैं, क्योंकि मॉडलफॉर्म उन चीज़ों को स्वचालित रूप से उपयोग करने का प्रयास करता है आदर्श। – Cerin

उत्तर

0

1: मैं यह गलत है, क्योंकि आप कुछ बहुत ही विशिष्ट सामान वहाँ पर जा रहा है नहीं लगता है:

  • विशिष्ट समय प्रविष्टियों (दोपहर, शाम 5 बजे खत्म होने वाली ..) startminutes

2 के लिए

  • 15 मिनट की वृद्धियों:नीचे टिप्पणी कहते हैं अपने क्षेत्र होना चाहिए: अद्यतन डिफ़ॉल्ट रूप से। यह सच है, यदि फ़ील्ड खाली छोड़ दिया गया है तो आपको अपने फॉर्म के साथ ValidationError प्राप्त करना चाहिए।

    क्या आप TypeError पोस्ट कर रहे हैं जिसके बारे में आप बात कर रहे हैं? क्या यह clean() ब्लॉक के बाहर हो रहा है? क्योंकि अगर आप अपने उदाहरण में अपने साफ फ़ंक्शन से cleaned_data वापस नहीं लौटते हैं, तो आपके फॉर्म में कोई भी डेटा नहीं होगा, भले ही यह प्रारंभ में ValidationErrors को उठाकर चेक आउट न हो।

    वैसे भी, आप प्रति फ़ील्ड सत्यापन के लिए clean_ विधियों का पता लगा सकते हैं।

    def clean_startdate(self): 
        if not self.cleaned_data['startdate']: 
          raise forms.ValidationError("Must enter a start date") 
    

    http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method

    3: तुम यहाँ स्पष्ट कर सकते हैं कि आप विरासत के साथ क्या करने की कोशिश कर रहे हैं क्या? ऐसा लगता है कि आपकी फील्ड परिभाषाएं इस फ़ॉर्म के लिए बहुत विशिष्ट हैं, इसलिए यह MyScheduleForm में यहां से संबंधित है।आप एक से अधिक के लिए इस पुन: उपयोग करने DateTimeField रों, हाँ आप प्रपत्र विरासत का उपयोग कर सकते देख रहे हैं)

    : विरासत पुनः उपयोग कोड के लिए है। आप एक ModelForm निर्धारित कर सकते हैं जैसे आप अब है, यह उपवर्ग, और ओवरराइड माता पिता की Meta के रूप में डॉक्स में यहाँ दिखाया गया है एक से अधिक मॉडल पर इसका इस्तेमाल करने के लिए: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#form-inheritance

    मैं भी बाहर की जाँच होगी कैसे Django अपनी SplitDateTimeWidget (करता है स्रोत की जांच करें): http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.SplitDateTimeWidget

    कुछ अन्य 'तृतीय पक्ष' विभाजित दिनांक समय विजेट्स इंटरवब्स पर भी ध्यान देने योग्य हैं!

  • +0

    आवश्यक = सही django फॉर्म फ़ील्ड के लिए डिफ़ॉल्ट सेटिंग है। –

    +0

    अच्छा बिंदु, लेकिन फिर उसे # 2 के साथ समस्या नहीं होनी चाहिए। मुझे आश्चर्य है कि वह क्षेत्र क्यों मान्य नहीं है? हम्म –

    +0

    आपकी प्रतिक्रिया के लिए धन्यवाद - यहां आपके प्रश्नों के कुछ जवाब दिए गए हैं: 1) मुझे पता है कि डिफ़ॉल्ट आवश्यक है = सही। समस्या यह है कि, यदि गैर-मॉडल फ़ील्ड्स (स्टार्टडेट, स्टार्टहोर इत्यादि) खाली छोड़ दिए जाते हैं, तो यह अपवाद नहीं फेंकता है और "अनुपलब्ध फ़ील्ड" जानकारी को मेरे रूप में वापस कर देता है। मैं चाहता हूं कि रिक्त फ़ील्ड होने पर रिक्तता और बाल्क की जांच करनी पड़े, लेकिन ऐसा लगता है कि रिक्त क्षेत्र बाद में साफ() 2) समस्याओं का कारण बनता है, फिर भी मैंने क्लीन_स्टार्टडेट() फ़ंक्शन जोड़ने का प्रयास किया, लेकिन ऐसा लगता है कभी नहीं बुलाया जाता है। हालांकि, मेरे मॉडल डीओ में फ़ील्ड के लिए क्लीन_ फ़ंक्शंस को कॉल किया जाता है। – Cyclic

    1
    1. यदि मैं आप थे, तो मैं दिनांक/समय प्रविष्टियों में प्रवेश के लिए customised Django-admin date/time widget(s) का उपयोग करता।

    2. फॉर्म सत्यापन के संबंध में, सुनिश्चित करें कि आप फ़ॉर्म-आधारित त्रुटियों को दिखाने के लिए अनुरोध के साथ जुड़े फ़ॉर्म को पास करते हैं। (नीचे नमूना कोड)

    3. विरासत का उपयोग करने के लिए, यह इस उपयोग के मामले के लिए एक अधिक होगा क्योंकि यह किसी भी उद्देश्य की सेवा नहीं करेगा और चीजों को सरल रखना बेहतर होगा।

    नमूना कोड:

    if request.POST: 
        form = MyScheduleForm(request.POST) 
        if form.is_valid(): 
         # Specific stuff with the variables here 
         pass 
    else: 
        form = MyScheduleForm() 
    
    +0

    को इंगित करने के लिए धन्यवाद, हाँ, मैं एक समान निर्माण का उपयोग कर रहा हूं। समस्या यह है कि गैर मॉडल फ़ील्ड कभी भी यह देखने के लिए चेक नहीं लगते हैं कि वे खाली हैं या नहीं, इसलिए यदि वे खाली हैं, तो वे अपवाद नहीं फेंकते हैं। मॉडल डीओ में मौजूद फ़ील्ड चेक किए जाते हैं, और अगर वे – Cyclic

    +0

    गायब हैं तो मुझे अपने फॉर्म में वापस एक त्रुटि मिली है, यह आंखों से मिलता है। मैं उपरोक्त कोड चला सकता हूं और यह मान्य हो जाता है! –

    0

    प्रपत्र फ़ील्ड्स कि खाली मान ही हो सकते के लिए, आप क्षेत्र के रूप में निम्नानुसार घोषित करना चाहिए:

    start_datetime=models.DateTimeField(blank=True, null=True) 
    

    यह रूप बताता है यह हो सकता है कि blank , और डेटाबेस फ़ील्ड null हो सकता है। यह उस समस्या को ठीक कर सकता है।

    यदि आप ऐसे फ़ील्ड को शामिल करने का प्रयास कर रहे हैं जो मॉडल का हिस्सा नहीं हैं तो आप मॉडलफॉर्म का उपयोग क्यों कर रहे हैं? ModelForms को आपके मॉडल पर सीधे बांधने वाले फ़ॉर्म बनाने के लिए डिज़ाइन किया गया है। बेशक उनके पास विभिन्न अनुकूलन हैं, लेकिन वास्तविक क्षेत्रों को बदलने से मुझे ऐसा लगता है कि एक नियमित रूप है।

    अन्यथा, यदि आप फॉर्म के दृश्य को विभाजित करना चाहते हैं, तो फॉर्म स्वयं ही नहीं, दिनांक समय फ़ील्ड, जैसे स्प्लिटडेट टाइमवेजेट प्रदर्शित करने के लिए एक कस्टम विजेट बनाएं। इसे उपclass, और ड्रॉप के मूल्यों के लिए अपने चुनाव प्रदान करते हैं।

    +0

    -1 क्या होगा यदि मैं इस कार्यक्षमता का अधिक उपयोग करना चाहता हूं और थोड़ा सा अनुकूलित करना चाहता हूं? – Alvaro

    +0

    @ अलवरो मैंने उल्लेख किया कि मेरे उत्तर में। कुछ अनुकूलन के लिए हुक हैं, लेकिन एक बहुत सारे फॉर्म फ़ील्ड जोड़ना जो मॉडल फ़ील्ड में मैप नहीं करते हैं * नहीं * मॉडल मॉडल क्या हैं। –

    1

    ठीक है, मुझे लगता है कि मैं इसे समझ आउट:

    Django 1.2 के रूप में, is_valid चल() ModelForms पर मॉडल मान्यता से चलाता है। मैंने माना था कि मॉडल साफ() फ़ंक्शन को मारने से पहले रिक्त मूल्यों के लिए फ़ील्ड की जांच की जाएगी, इसलिए मेरा साफ फ़ंक्शन रिक्त मान या किसी भी प्रकार के प्रकार की जांच नहीं करता है। असल में, मेरे मॉडल में मेरा साफ() कुछ ऐसा दिखता है:

    def clean(self): 
        if self.start_datetime > datetime.now(): 
         raise ValidationError('Start date can\'t be in the future') 
    

    तो मुझे लगता है कि ज्यादातर मेरे प्रश्न का उत्तर देते हैं। हालांकि, मेरे पास 1 शेष प्रश्न है:

    मॉडल क्लीन() में रिक्त मूल्यों की जांच करना सबसे अच्छा है, या ऐसा करने का एक बेहतर तरीका है? मॉडलफॉर्म की बजाय मॉडल में रिक्त स्थान की जांच करने के लिए हैकिश लगता है - क्या आवश्यक फ़ील्ड पर अनुपलब्ध इनपुट को ध्वजांकित करने के लिए प्रपत्र फ़ील्ड पर सत्यापन है?

    हर किसी की मदद के लिए धन्यवाद।

    +0

    निश्चित रूप से 'ModelForm' पर 'clean_field' विधियों का उपयोग करें। मैं बहुत उलझन में हूं क्योंकि जब मैं आपके फॉर्म को पुन: उत्पन्न करता हूं, तो मुझे अपने मॉडलफॉर्म में जोड़े गए अतिरिक्त फ़ील्ड के लिए 'सत्यापन' त्रुटि मिलती है। मैंने एक मॉडलफॉर्म बनाया है, आपके जैसे ही एक साफ विधि जोड़ा है, और प्रमाणीकरण ट्रिगर किया गया है .. क्या आपके मॉडलफॉर्म के अलावा कुछ और दिखाया गया है? –

    +0

    मुझे लगता है कि यहां समस्या (इसके साथ गड़बड़ करने के बाद) - यदि फ़ील्ड खाली है, तो इसे कभी भी cleaned_data में जोड़ा नहीं जाता है, और clean_field विधि कभी नहीं चलती है। यह फिर फॉर्म साफ() और मॉडल साफ() चलाता है। मेरे मामले में, मॉडल क्लीन() ने एक साफ़ एरर अपवाद का कारण बना दिया जो तुलनात्मक() में किया गया था, जिससे मेरा कोड विफल हो गया। मुझे यह समस्या है (अगर मैं गलत हूं तो मुझे सही करें) - रिक्त मान अपवादों को ट्रिगर नहीं करते हैं, वे केवल is_valid() को असफल होने का कारण बनते हैं और वे error_list में कोई त्रुटि जोड़ते हैं। चूंकि मुझे एक और त्रुटि थी (जो वास्तव में डीआईडी ​​ने एक एक्स्पेट फेंक दिया), जिससे मेरी समस्या आई – Cyclic