2008-09-16 13 views
7

मेरे पास एक वेब रिपोर्ट है जो रिपोर्ट जेनरेट करने के लिए उपयोग की जाने वाली क्वेरी को नियंत्रित करने वाले फ़ील्ड के लिए एक Django फॉर्म (नए रूप) का उपयोग करती है (प्रारंभ तिथि, समाप्ति तिथि, ...)। मेरे पास यह मुद्दा यह है कि पृष्ठ को फ़ॉर्म के शुरुआती मानों (अनबाउंड) का उपयोग करके काम करना चाहिए, लेकिन जब तक मैं is_valid() को कॉल नहीं करता तब तक मैं cleaned_data फ़ील्ड तक नहीं पहुंच सकता। लेकिन is_valid() हमेशा अनबाउंड रूपों में विफल रहता है।एक अनबाउंड फॉर्म से फॉर्म मानों का उपयोग कैसे करें

ऐसा लगता है जैसे Django के रूपों को संपादन डेटा के उपयोग के मामले के साथ डिजाइन किया गया था, जैसे कि एक अनबाउंड फॉर्म HTML प्रदर्शित करने के अलावा किसी अन्य चीज़ के लिए वास्तव में उपयोगी नहीं है।

उदाहरण के लिए

, अगर मेरे पास है:

if request.method == 'GET': 
    form = MyForm() 
else: 
    form = MyForm(request.method.POST) 

if form.is_valid(): 
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

is_valid() विफल हो जाएगा अगर यह एक प्राप्त है (क्योंकि यह अबाध है), और अगर मैं कार्य करें:

if request.method == 'GET': 
    form = MyForm() 
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 
else: 
    form = MyForm(request.method.POST) 
    if form.is_valid(): 
     do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

करने के लिए पहली कॉल do_query form.cleaned_data पर अपवादों को ट्रिगर करता है, जो मान्य फ़ील्ड नहीं है क्योंकि is_valid() को नहीं कहा गया है। ऐसा लगता है जैसे मैं कुछ ऐसा करना है:

if request.method == 'GET': 
    form = MyForm() 
    do_query(form['start_date'].field.initial, form['end_date'].field.initial) 
else: 
    form = MyForm(request.method.POST) 
    if form.is_valid(): 
     do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

है कि, वहाँ एक बाध्य फार्म और एक अबाध एक के बीच प्रपत्र के मूल्यों को पुन: प्राप्त करने के लिए एक आम इंटरफेस नहीं है।

क्या कोई ऐसा करने के लिए क्लीनर तरीका देखता है?

उत्तर

4

आप अपने प्रपत्र वर्ग के लिए इस विधि जोड़ते हैं:

def get_cleaned_or_initial(self, fieldname): 
     if hasattr(self, 'cleaned_data'): 
      return self.cleaned_data.get(fieldname) 
     else: 
      return self[fieldname].field.initial 

आप तो अपने कोड को फिर से लिख सकता है के रूप में:

if request.method == 'GET': 
    form = MyForm() 
else: 
    form = MyForm(request.method.POST) 
    form.is_valid() 

do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date')) 
0

आपने अपने फ़ॉर्म में प्रारंभिक मान का एक शब्दकोश पारित कर सकते हैं:

if request.method == "GET": 
    # calculate my_start_date and my_end_date here... 
    form = MyForm({ 'start_date': my_start_date, 'end_date': my_end_date}) 
... 

official forms API documentation, जहां वे इस का प्रदर्शन देखें।

संपादित: अन्य उपयोगकर्ताओं से उत्तर के आधार पर, हो सकता है यह साफ समाधान है:

if request.method == "GET": 
    form = MyForm() 
    form['start_date'] = form['start_date'].field.initial 
    form['end_date'] = form['end_date'].field.initial 
else: 
    form = MyForm(request.method.POST) 
if form.is_valid(): 
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

मैं हालांकि यह प्रयास नहीं किया है; क्या कोई पुष्टि कर सकता है कि यह काम करता है? मुझे लगता है कि यह एक नई विधि बनाने से बेहतर है, क्योंकि इस दृष्टिकोण को आपके नए 'जादू' एक्सेसर के बारे में जानने के लिए अन्य कोड (संभवतः आपके द्वारा लिखित नहीं) की आवश्यकता नहीं है।

+0

हां, लेकिन फिर डिफ़ॉल्ट मान फॉर्म के साथ परिभाषित नहीं किए गए हैं (जैसे फ़ील्ड घोषणाओं में प्रारंभिक = मान के साथ)। यदि आप एकाधिक स्थानों में फ़ॉर्म का उपयोग करते हैं तो आपको अपने डिफ़ॉल्ट मान दोहराना होगा। – davidavr

1

अनबाउंड मतलब है कि विधि से संबद्ध कोई डेटा (है या तो प्रारंभिक या बाद में प्रदान किया गया), इसलिए सत्यापन विफल हो सकता है। जैसा कि अन्य उत्तरों में बताया गया है (और अपने स्वयं के निष्कर्ष में), आपको प्रारंभिक मान प्रदान करना होगा और दोनों बाध्य डेटा और प्रारंभिक मानों की जांच करना होगा।

फॉर्मों के लिए उपयोग केस और सत्यापन प्रसंस्करण है, इसलिए आपके पास cleaned_data तक पहुंचने से पहले सत्यापित करने के लिए कुछ डेटा होना चाहिए।

संबंधित मुद्दे