Django窗体ImageField

2024-03-28 13:18:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为保存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

表单.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_logo s”文件夹并采用默认值。我做错什么了?


Tags: djangofrompy图像importform表单album
2条回答

这可能对你有帮助

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'
        ]

以及aslo add in form tag add this property

enctype="multipart/form-data"

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

文档

表单.py

from django import forms

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

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

请注意,request.FILES仅在request方法为POST且发出请求的具有enctype=“multipart/form data”属性时才包含数据。否则,request.FILES将为空。


更新了album\u 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 %}

相关问题 更多 >