Джанго из ImageField

Я пытаюсь установить CreateView для модели, которая содержит ImageField. Я могу успешно загружать и отображать изображения со страницы администратора django. Но когда я загружаю изображения из своей формы, django не загружает изображения в папку «upload_to». Я пишу свои коды ниже:

модели.py

from django.db import models


class Album(models.Model):
    title = models.CharField(max_length=127)
    artist = models.CharField(max_length=63)
    release_date = models.DateField()
    logo = models.ImageField(blank=True, upload_to='album_logos', default='album_logos/no-image.jpg')

    def __str__(self):
        return self.title

формы.py

from django import forms

from .models import Album
class AlbumCreateForm(forms.ModelForm):

    class Meta:
        model = Album
        fields = [
            'title',
            'artist',
            'release_date',
            'logo'
        ]

просмотры.py

class AlbumCreateView(CreateView):
    form_class = AlbumCreateForm
    template_name = 'music/album_create.html'
    success_url = '/albums/'

альбом_создать.html

{% extends 'base.html' %}

{% block content %}
<form method="post">{% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Create</button>
</form>

{% endblock %}

Когда я пытаюсь создать альбом с помощью «album_create.html» и загрузить изображение с формой по умолчанию django, изображение логотипа не загружается в папку «album_logos» и принимает значение по умолчанию. Где я делаю неправильно?


person Elgin Cahangirov    schedule 12.12.2017    source источник
comment
вы можете попробовать это, logo = models.ImageField(upload_to='album_logos') и проверить любую трассировку стека   -  person Robert    schedule 12.12.2017
comment
Я пробовал. Без значения по умолчанию django говорит, что это поле обязательно. над формой ввода поля изображения.   -  person Elgin Cahangirov    schedule 12.12.2017


Ответы (2)


Я изменил альбом_создать.html, указав атрибут «enctype» для тега «форма», как указано в документации django, и моя проблема решена.

ДОКУМЕНТАЦИЯ

формы.py

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

Представление, обрабатывающее эту форму, получит данные файла в request.FILES, который представляет собой словарь, содержащий ключ для каждого FileField (или ImageField, или другого подкласса FileField) в форме. Таким образом, данные из приведенной выше формы будут доступны как request.FILES['file'].

Обратите внимание, что request.FILES будет содержать данные только в том случае, если метод запроса был POST и отправивший запрос имеет атрибут enctype="multipart/form-data". В противном случае request.FILES будет пустым.


ОБНОВЛЕНО альбом_create.html

{% extends 'base.html' %}

{% block content %}
<form method="post" enctype="multipart/form-data">{% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Create</button>
</form>

{% endblock %}
person Elgin Cahangirov    schedule 13.12.2017

Это может вам помочь

from django.utils.safestring import mark_safe
class PictureWidget(forms.widgets.Widget):
    def render(self, name, value, attrs=None):
        html =  Template("""<img src="$link"/>""")
        return mark_safe(html.substitute(link=value)

class AlbumCreateForm(forms.ModelForm):
    logo = ImageField(widget=PictureWidget)
    class Meta:
        model = Album
        fields = [
            'title',
            'artist',
            'release_date',
            'logo'
        ]

А также добавить в тег формы добавить это свойство

enctype="мультипарт/форма-данные"

person Robert    schedule 12.12.2017
comment
@ElginCahangirov, проверь мой последний ответ - person Robert; 12.12.2017
comment
Я не могу запустить сервер с вашим кодом. Пишет неверный синтаксис. Не могу понять, где проблема. - person Elgin Cahangirov; 12.12.2017
comment
Да, я прокомментировал свой собственный код, а затем скопировал и вставил ваш код. Теперь с вашим кодом сервер не запустится. - person Elgin Cahangirov; 12.12.2017
comment
/home/elgin/Desktop/python/pycharm/django/muplay/music/urls.py, строка 2, в ‹модуле› из . import views File /home/elgin/Desktop/python/pycharm/django/muplay/music/views.py, строка 6, в ‹module› из .forms import AlbumCreateForm File /home/elgin/Desktop/python/pycharm/django/ muplay/music/forms.py, строка 25 class AlbumCreateForm(forms.ModelForm): ^ SyntaxError: неверный синтаксис - person Elgin Cahangirov; 12.12.2017
comment
Вы можете добавить последнюю форму - person Robert; 12.12.2017
comment
Это не работает. TypeError: __init__() получил неожиданный ключевой аргумент "виджет" - person Elgin Cahangirov; 12.12.2017
comment
NameError: name 'ImageField' не определен :( - person Carlos Andres; 08.10.2018
comment
может определить вашу модальную версию и версию django - person Robert; 08.10.2018