Django 表单 ImageField

Elg*_*rov 1 python django django-forms imagefield

我正在尝试为包含 ImageField 的模型建立 CreateView。我可以从 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
Run Code Online (Sandbox Code Playgroud)

表格.py

from django import forms

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

    class Meta:
        model = Album
        fields = [
            'title',
            'artist',
            'release_date',
            'logo'
        ]
Run Code Online (Sandbox Code Playgroud)

视图.py

class AlbumCreateView(CreateView):
    form_class = AlbumCreateForm
    template_name = 'music/album_create.html'
    success_url = '/albums/'
Run Code Online (Sandbox Code Playgroud)

相册_create.html

{% extends 'base.html' %}

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

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用“album_create.html”创建相册并使用 django 的默认表单上传图像时,徽标图像不会上传到“album_logos”文件夹并采用默认值。我哪里做错了?

Elg*_*rov 5

我通过为 django 文档中所述的“form”标签指定“enctype”属性来更改album_create.html,我的问题解决了。

文件

表格.py

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()
Run Code Online (Sandbox Code Playgroud)

处理此表单的视图将接收 request.FILES 中的文件数据,它是一个字典,其中包含表单中每个 FileField(或 ImageField,或其他 FileField 子类)的键。因此,上面表单中的数据可以作为 request.FILES['file'] 访问。

请注意,如果请求方法是 POST 并且发布请求的具有属性 enctype="multipart/form-data",则 request.FILES 将仅包含数据。否则, 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 %}
Run Code Online (Sandbox Code Playgroud)