Переопределение 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')