представления django vanilla создают экземпляр с imagefield с помощью CreateView

#django #image #forms

#django #изображение #формы

Вопрос:

Я использую ванильные представления django (https://github.com/tomchristie/django-vanilla-views ) для редактирования объекта модели (Model CreateView модели) у этой модели есть поле изображения.

но при создании, похоже, изображение не сохраняется, возможно, из-за моего нестандартного использования.

есть несколько вещей:

  • для модели ImageField я использую функцию upload_to для сохранения изображения в определенный каталог
  • Создание выполняется с некоторой информацией, которая не должна быть заполнена пользователем, поэтому я использую отправку, чтобы получить связанный объект из URL
  • перед сохранением в функции form_valid я использую form.save(commit=False), чем выполняю некоторые действия перед сохранением, а затем сохраняю объект

код:

функция, используемая для upload_to

 def get_image_path_albumphoto(instance, filename):
    return os.path.join('albums', slugify(str(instance.album)), filename)
  

модель (по крайней мере, значимые поля):

 class AlbumPhoto(models.Model):
    .... some fields ...
    album = models.ForeignKey(Album, blank=False, null=False)
    image = models.ImageField(upload_to=get_image_path_albumphoto, blank=True, null=True)
  

создать представление:

 class AlbumPhotoCreate(CreateView):
    model = AlbumPhoto
    fields=('all the other fields except the album','image')

def dispatch(self, *args, **kwargs):
    self.album = get_object_or_none(Album, id=kwargs['album_id'])
    return super(AlbumPhotoCreate, self).dispatch(*args, **kwargs)    

def get_context_data(self, **kwargs):
    kwargs['album'] = self.album
    return kwargs

def get_form(self, data=None, files=None, **kwargs):
    initial={'some_field':'gets_initialized here'}
    kwargs['initial']=initial
    return  super(AlbumPhotoCreate, self).get_form(data,files, **kwargs)

def get_success_url(self):
    if self.album:
        return 'an url using the album id with %d' % self.album.id
    return reverse_lazy('albumphoto_list')

def form_valid(self, form):
    obj = form.save(commit=False)
    obj.album=self.album
    obj.save()
    success_url= 'some url with the object id as %d' % obj.id
    return HttpResponseRedirect(success_url)  
  

но изображение никогда не сохраняется с помощью этого кода …. это работает при использовании администратора django для добавления объекта,,, так что это что-то в использовании этого CreateView

Обновить

Я попытался изменить свой код, сначала включив альбом в поля, удалил функции отправки и form_valid… нет успеха… наконец, инициализация удалена… (get_form) также нет успеха … и это, по сути, использование CreateView по умолчанию… так что, вероятно, это что-то в функции upload_to … (?)

Ответ №1:

Ответ на эту проблему был более общим, чем был сформулирован этот вопрос:

Представление обновления vanilla было расширенной версией GenericModelView, поэтому эта проблема была более общей и не вызвана представлением django vanilla.

Чтобы загрузить файл с помощью представления формы, тег формы в шаблоне должен иметь:

enctype=»multipart/ form-data»

например:

 <form method="POST" action="." enctype="multipart/form-data">