Django Проверить изображение или файл с помощью формы внутри формы - PullRequest
0 голосов
/ 12 июля 2020

Здравствуйте, у меня проблема с несколькими изображениями в одном поле. Насколько я знаю, в учебнике django они говорят об этом.

  for f in request.FILES.getlist('files'):
     # do something (validate here maybe)

, в котором я не совсем понимаю. Как сделать ручную проверку? Если да, то почему? В любом случае, есть другой подход, который они предлагают

  files = forms.FileField(widget=ClearableFileInput(attrs={'multiple': True})

Этот не работает так, как я хочу. Это self.cleaned_data ['files'] дает только один результат (здесь есть аналогичная проблема), а django / multiupload имел ошибку в моем опыте, и, к сожалению, это было слишком медленно, чтобы исправить: (.

What Я хочу проверять каждый файл и выдавать ошибки каждому через ImageField, потому что мне нравится, что он проверяет файл, а не я сам его кодирую.

Таким образом, я создал код прототипа.

forms.py

class ImageForm(forms.Form):
   # validate each image here
   image = forms.ImageField()

class BaseForm(forms.Form):
   # first form
   ping = forms.CharField()

   #images = SomeThingMultipleFileField that will raise multiple errors each validate image.
   # since no option I decided to do that. below.
   # so for decoration that images is required.
   images = forms.ImageField()

   def handle(self, request, *args, **kwargs):
      #custom function 
      image_list = []
      errors = []
      
      # validate each image in images via another form
      # if there is errors e.g this field is required will be append to errors = []
      for image in request.FILES.getlist('images'):
          data = ImageForm(image)
          
          if data.is_valid():
             image_list.append(data.cleaned_data['image'])
             
          else:
             errors.append(data.errors)
     if errors:
          # raise errors
     # return the data    

views.py

def base(request):
   # this is an api
   # expected input should be from the code or format
   # {'ping': 'test', 'images': 1.jpg, 'images': 2.jpg}
   # This is not the actual view code.

   data = forms.BaseForm(request.POST, request.FILES)
   if data.is_valid():
      value = data.handle(request)
      return JSONResponse({'data': value})
   return JSONResponse({'errors': data.errors})

Не элегантно, если честно, но сейчас проблемы и больше нет вариантов, о которых я не могу думать, но это. Проблема в моем коде заключается в том, что

data = ImageForm(image) 

не читает файл, поэтому список_изображений всегда пуст

  1. Так кто-нибудь может мне здесь помочь? Я застрял
  2. Есть лучший подход?
  3. Меня также интересует общая ошибка, например, если одно изображение недействительно, оно запускается как {'files': 'Одно из изображений недействительно.'}

1 Ответ

0 голосов
/ 13 июля 2020

до сих пор, я тестировал еще раз, так что мой плохой кажется, что требуется формат данных, файлы в обычных формах. для этого.

forms.py

... # previous code
# data = ImageForm(image) , old code
data = ImageForm({}, {'image': image})

таким образом, он заполняет стандартные QueryDict: {}, MultiValueDict в аргументах

Number 3 можно ответить. вместо

# previous code
else:
  errors.append(error)

теперь должно быть

   raise ValidationError(_('Your error'))

Любой лучший подход? Я не могу думать о многом, к сожалению. Так что любой здесь споткнется. не стесняйтесь комментировать. Большое спасибо за помощь.

...