मेरे पास एक वेब रिपोर्ट है जो रिपोर्ट जेनरेट करने के लिए उपयोग की जाने वाली क्वेरी को नियंत्रित करने वाले फ़ील्ड के लिए एक 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'])
है कि, वहाँ एक बाध्य फार्म और एक अबाध एक के बीच प्रपत्र के मूल्यों को पुन: प्राप्त करने के लिए एक आम इंटरफेस नहीं है।
क्या कोई ऐसा करने के लिए क्लीनर तरीका देखता है?
हां, लेकिन फिर डिफ़ॉल्ट मान फॉर्म के साथ परिभाषित नहीं किए गए हैं (जैसे फ़ील्ड घोषणाओं में प्रारंभिक = मान के साथ)। यदि आप एकाधिक स्थानों में फ़ॉर्म का उपयोग करते हैं तो आपको अपने डिफ़ॉल्ट मान दोहराना होगा। – davidavr