2010-03-01 20 views
7

मेरे पास एक Django फॉर्म है जो उपयोगकर्ता को अपना पासवर्ड बदलने की अनुमति देता है। मुझे खेतों के लिए फॉर्म त्रुटि पर उलझन में लग रहा है * अभी भी उनमें डेटा संपादित करें।फॉर्म सत्यापन सत्यापन त्रुटि पर Django फॉर्म फ़ील्ड साफ़ करना?

मैंने form.data को हटाने के लिए कई विधियों का प्रयास किया है, लेकिन मुझे This QueryDict instance is immutable अपवाद संदेश मिल रहा है।

क्या व्यक्तिगत फॉर्म फ़ील्ड या clean() से पूरे फॉर्म डेटा को साफ़ करने का कोई सही तरीका है?

+0

आप जावास्क्रिप्ट का उपयोग कर सकते हैं, जो 95% मामलों में काम करेगा: http://www.w3schools.com/browsers /browsers_stats.asp; उदाहरण: http: //www.learningjquery।कॉम/2007/08/समाशोधन-फॉर्म-डेटा – miku

उत्तर

0

यदि आपको किसी फॉर्म से एक से अधिक फ़ील्ड का उपयोग करके अतिरिक्त सत्यापन की आवश्यकता है, तो .clean() विधि को ओवरराइड करें। लेकिन अगर यह सिर्फ एक फ़ील्ड के लिए है, तो आप clean_field_name() विधि बना सकते हैं।

http://docs.djangoproject.com/en/1.1/ref/forms/validation/#ref-forms-validation

+0

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

+3

इगोर सही रास्ते पर है, हालांकि, क्रिसडब्ल्यू। आईएमओ, आपको दो पासवर्ड मान्य करने के लिए स्वच्छ() विधि का उपयोग करना चाहिए - और यदि वे सत्यापन त्रुटि को बढ़ाने से पहले, उस बिंदु पर self.data फ़ील्ड <उस बिंदु पर सही नहीं हैं। – pithyless

+0

क्या कोई और थोड़ा विस्तार कर सकता है। जब मैं self.data ['field'] कोशिश करता हूं = सत्यापन को बढ़ाने से पहले कोई भी नहीं होता कुछ भी नहीं होता है, और सत्यापन त्रुटि भी नहीं उठाई जाती है। – joshcartme

-2

मैं तुम्हें छुपाने या कंटेनर से पाठ को दूर करने के लिए JavaScript का उपयोग करने की आवश्यकता है लगता है।

+0

निश्चित रूप से इस सर्वर-पक्ष को करने का एक तरीका होना चाहिए ... क्लाइंट-साइड जावास्क्रिप्ट के आधार पर यह पूरा करने के लिए एक बहुत गन्दा तरीका है। – ChrisW

2

किसी ने मुझे दिखाया कि यह कैसे करें। यह विधि मेरे लिए काम कर रही है:

post_vars = {} 
post_vars.update(request.POST) 
form = MyForm(post_vars, auto_id='my-form-%s') 
form.data['fieldname'] = '' 
form.data['fieldname2'] = '' 
+1

यह काम करता है, लेकिन यह बहुत साफ नहीं है क्योंकि आप इसे दृश्य स्तर पर कर रहे हैं। आईएमओ, आपको डिफ़ॉल्ट लॉगिन फॉर्म को उप-वर्गीकृत करना चाहिए और साफ() विधि को इगोर के रूप में प्रतिस्थापित करना चाहिए। यही है, पहले मान्य करें कि वे सही हैं; प्रासंगिक self.data फ़ील्ड को साफ़ करें, और अंत में एक सत्यापन प्रमाणीकरण बढ़ाएं। – pithyless

+0

कोई मौका आप विस्तारित कर सकते हैं? मुझे अभी भी अपरिवर्तनीय क्वेरीडिक्ट त्रुटियां मिलती हैं। – joshcartme

+0

post_vars.update (request.POST) dict (request.POST) करने का एक कम साफ तरीका है। किसी भी मामले में, फ़ॉर्म द्वारा सबमिट किए गए मान जिन्हें आप form.data के साथ ओवरराइड नहीं करते हैं, प्रस्तुत किए गए रूप में दिखाए जाते हैं जैसे कि '' (यह सुनिश्चित नहीं है कि यह क्यों होता है)। @Ian द्वारा सुझाए गए अनुरोध के रूप में request.POST.copy() का उपयोग करना एक आकर्षण की तरह काम करता है। – Josh

0

क्या आप सत्यापन के दौरान फ़ॉर्म के cleaned_data से पासवर्ड डेटा हटा नहीं सकते?

the Django docs for custom validation (विशेष रूप से कोड का दूसरा ब्लॉक) देखें।

6

अपरिवर्तनीय QueryDict त्रुटि के बारे में, आपकी समस्या को लगभग निश्चित रूप से है कि आप इस तरह अपने प्रपत्र उदाहरण बनाया है:

form = MyForm(request.POST) 

इसका मतलब है कि form.data वास्तविक पोस्ट से बनाए गए QueryDict वार्स है। चूंकि अनुरोध स्वयं अपरिवर्तनीय है, इसलिए जब आप इसमें कुछ भी बदलने की कोशिश करते हैं तो आपको एक त्रुटि मिलती है। इस मामले में, यह कहते हुए

form.data['field'] = None 

बिल्कुल

request.POST['field'] = None 

खुद के एक रूप है कि आप संशोधित कर सकते हैं प्राप्त करने के लिए के रूप में ही बात है, तो आप इसे इस का निर्माण करना चाहते हैं:

form = MyForm(request.POST.copy()) 
+0

ध्यान दें कि फ़ाइल फ़ील्ड या फ़ॉर्म में एक छवि फ़ील्ड के लिए आपको form.files सेट करना होगा और उसी तरह form.data नहीं होगा। – krypto07

0

मैंने अभी फॉर्म फिर से बनाया है।

बस कोशिश:

form = AwesomeForm() 

और फिर इसे प्रस्तुत करना। https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#passwordinput

अब

आप कुछ इस तरह कर सकते हैं यदि आप पासवर्ड के साथ काम नहीं कर रहे:

0

Django एक विजेट है कि कि है

class NonceInput(Input): 
    """ 
    Hidden Input that resets its value after invalid data is entered 
    """ 
    input_type = 'hidden' 
    is_hidden = True 

    def render(self, name, value, attrs=None): 
     return super(NonceInput, self).render(name, None, attrs) 

बेशक आप किसी भी Django विजेट भूल कर सकते हैं अपने इसकी रेंडर विधि को ओवरराइड करके मूल्य (मूल्य के बदले मैंने सुपर कॉल में कोई भी नहीं पारित किया।)

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