2011-10-25 12 views
15

पर गायब हो जाता है यहाँ समस्या है, मैं एक Django फार्म एक फ़ाइल क्षेत्र युक्त, अर्थात् है: प्रपत्र सत्यापित करताDjango फार्म फ़ाइल फील्ड प्रपत्र त्रुटि

photo = forms.FileField(help_text="Please attach a photo", required=False) 

हैं, तो फ़ाइल क्षेत्र घिरा है और सही ढंग से सहेजा गया है। समस्या तब होती है जब उपयोगकर्ता सभी रूपों को भरता है और यह मान्य नहीं होता है: चयनित फ़ाइल का पथ गायब हो जाता है।

तो, यदि उपयोगकर्ता को इसके बारे में एहसास नहीं होता है, तो वह अन्य फ़ील्ड त्रुटियों को ठीक करता है और फिर सबमिट करता है - इस बार कोई फोटो नहीं।

शायद ज़रुरत पड़े, प्रपत्र इस तरह ध्यान में रखते हुए बनाई गई है:

ProfileForm(request.POST or None, request.FILES or None) 

और HTML है:

<div id="uniform-id_photo" class="uploader"> 
    <input id="id_photo" class="clearablefileinput" type="file" name="photo" size="19" style="opacity: 0;"> 
    <span class="filename" style="-moz-user-select: none;">No file selected</span> 
    <span class="action" style="-moz-user-select: none;">Choose File</span> 
</div> 

किसी को भी पहले की तरह ही समस्या थी गया है? समाधान के प्रति कोई विचार? :)

धन्यवाद!

+0

यदि आप django व्यवस्थापक को देखते हैं, जब भी आप गलत फॉर्म सबमिट करते हैं तो यह फ़ाइल पथ को रीसेट करता है। मुझे लगता है कि ऐसा करने का कोई तरीका नहीं है लेकिन क्यों अपने एचटीएमएल में फ़ाइल फ़ील्ड को हाइलाइट नहीं करना है? – iva123

+0

हां, शायद उपयोगकर्ता के ध्यान को कॉल करने का सबसे आसान तरीका होगा। धन्यवाद! – Sam

उत्तर

26

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

कारण यह है कि यदि कोई वेबसाइट ऐसा कर सकती है, तो यह एक वेक्टर खोल देगा जो किसी भी वेबसाइट को फ़ाइल पथ का अनुमान लगाकर आपके कंप्यूटर पर किसी भी फाइल को चोरी करने की अनुमति देगा - वे सिर्फ पृष्ठभूमि में एक स्क्रिप्ट चल सकते हैं दिलचस्प फ़ाइलों को सर्वर पर वापस पोस्ट करने का प्रयास किया।

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

class CustomClearableFileInput(ClearableFileInput): 

def render(self, name, value, attrs=None): 
    if len(<YourModel>.objects.filter(id=self.form_instance_id))>0: 
     file = <YourModel>.objects.get(id=self.form_instance_id).<yourField> 
    else: 
     file = '' 
    substitutions = { 
     'initial_text': self.initial_text, 
     'input_text': self.input_text, 
     'clear_template': '', 
     'clear_checkbox_label': self.clear_checkbox_label, 
    } 
    template = '%(input)s' 
    substitutions['input'] = super(ClearableFileInput, self).render(name, value, attrs) 
    self.template_with_initial = ('<p class="file-upload">%s</p>' 
         % self.template_with_initial) 
    self.template_with_clear = ('<span class="clearable-file-input">%s</span>' 
         % self.template_with_clear) 

    if value and hasattr(value, "url"): 
     template = self.template_with_initial 
     substitutions['initial'] = format_html(self.url_markup_template, 
               value.url, 
               force_text(value)) 
     if not self.is_required: 
      checkbox_name = self.clear_checkbox_name(name) 
      checkbox_id = self.clear_checkbox_id(checkbox_name) 
      substitutions['clear_checkbox_name'] = conditional_escape(checkbox_name) 
      substitutions['clear_checkbox_id'] = conditional_escape(checkbox_id) 
      substitutions['clear'] = CheckboxInput().render(checkbox_name, False, attrs={'id': checkbox_id}) 
      substitutions['clear_template'] = self.template_with_clear % substitutions 
      url = '' if file == '' else file.url 
    else: 
     template = self.template_with_initial 

     substitutions['initial'] = format_html(self.url_markup_template, 
               url, 
               force_text(file)) 
     if not self.is_required: 
      checkbox_name = self.clear_checkbox_name(name) 
      checkbox_id = self.clear_checkbox_id(checkbox_name) 
      substitutions['clear_checkbox_name'] = conditional_escape(checkbox_name) 
      substitutions['clear_checkbox_id'] = conditional_escape(checkbox_id) 
      if fav == '': 
       substitutions['clear'] = CheckboxInput().render(checkbox_name, False, attrs={'id': checkbox_id, 'disabled': 'disabled'}) 
      else: 
       substitutions['clear'] = CheckboxInput().render(checkbox_name, False, attrs={'id': checkbox_id}) 
      substitutions['clear_template'] = self.template_with_clear % substitutions 



    return mark_safe(template % substitutions) 

और फिर अपने रूप में आप लिखना चाहिए:

class <YourModel>Form(ModelForm): 
    class Meta: 
     model = <YourModel> 
     fields = '__all__' 
     widgets= {'<YourField>': CustomClearableFileInput} 

    def __init__(self, *args, **kwargs): 
     super(OperatorSettingsForm, self).__init__(*args, **kwargs) 
     self.fields['<YourField>'].widget.form_instance_id = self.instance.id 

यह मेरे लिए काम करता

+0

मैं देखता हूं, समझ में आता है। दयालु और विस्तृत उत्तर के लिए धन्यवाद! – Sam

+0

एक और कामकाज फॉर्म को प्रमाणित करने के लिए AJAX अनुरोध करने के लिए है। –

0

मैं कुछ समाधान लिखें। मुझे लगता है कि आपको कोई समस्या नहीं होगी :)

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