Необязательный FileField Django - PullRequest
1 голос
/ 23 февраля 2012

Переопределение FileField для проверки входного файла CSV.Иметь форму и пытаться предоставить пользователю возможность ввода простых запросов в виде CharField через запятую и больших запросов в виде CSV.Я пробовал required = False, но я не уверен, как передать его в метод переопределения.

В идеале хотелось бы отобразить сообщение об ошибке «Введите что-то», если CharField и FileField оба пусты, обработать CharField, если FileField пуст, и всегда обрабатывать FileField, если он заполнен.* Любая помощь или указатели высоко ценится.

forms.py

class userGroupForm(forms.Form):
    userGroup_entryList = MultiEntryField(max_items=10)
    userGroup_entryFile = CSVFileField(max_items=40)
    userGroup_queryType = forms.ChoiceField(choices=(('User','User'),('Group','Group')))
    userGroup_sourceType = forms.ChoiceField(choices=(('Corp','Corp'),('Prod','Prod')))

fields.py

class MultiEntryField(forms.Field):
    def __init__(self, *args, **kwargs):
            self.max_items = kwargs.pop("max_items")
            super(MultiEntryField,self).__init__(*args,**kwargs)
    def to_python(self,value):
            if not value:
                    return []
            else:
                    entries = []
                    for entry in value.split(','):
                            entries.append(entry.replace(' ',''))
                    return entries
    def validate(self,items):
            super(MultiEntryField, self).validate(items)
            if len(items) > self.max_items:
                    raise forms.ValidationError('ERROR - More than '+str(self.max_items)+' items')
            for item in items:
                    if re.search('[^a-zA-Z0-9-_/.]',str(item)):
                            raise forms.ValidationError('ERROR - Only alphanumeric characters')

class CSVFileField(forms.FileField):
    def __init__(self, *args, **kwargs):
            self.max_items = kwargs.pop("max_items")
            super(CSVFileField,self).__init__(*args,**kwargs)
    def validate(self,file):
            super(CSVFileField, self).validate(file)
            if file:
                    if file._size >= 5000:
                            raise forms.ValidationError('ERROR - File bigger than 5KB')
                    if file.content_type not in ['application/vnd.ms-excel'] or os.path.splitext(file._name)[1] not in [".csv"]:
                            raise forms.ValidationError('ERROR - Not a CSV file')
                    try:
                            fileReader = csv.reader(file.file)
                    except:
                            raise forms.ValidationError('ERROR - Problem reading file')
                    fileList = []
                    for row in fileReader:
                            fileList.append(row[0])
                    if len(fileList) > self.max_items:
                            raise forms.ValidationError('ERROR - More than '+str(self.max_items)+' items')
                    for item in fileList:
                            if re.search('[^a-zA-Z0-9-_/.]',str(item)):
                                    raise forms.ValidationError('ERROR - Only alpanumeric characters')
            else:
                    raise forms.ValidationError('ERROR - No file to process')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...