【问题标题】:Django form ImageFieldDjango 表单 ImageField
【发布时间】:2018-05-26 11:53:30
【问题描述】:

我正在尝试为包含 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

forms.py

from django import forms

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

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

views.py

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

album_create.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”文件夹并采用默认值。我哪里做错了?

【问题讨论】:

  • 你能试试这个吗,logo = models.ImageField(upload_to='album_logos') 并检查任何堆栈跟踪
  • 我试过了。如果没有默认值,django 会说“此字段是必需的”。上面的图像字段输入表单。

标签: python django django-forms imagefield


【解决方案1】:

这可能对你有帮助

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="multipart/form-data"

【讨论】:

  • @ElginCahangirov 检查我的最新答案
  • 我无法使用您的代码运行服务器。它说无效的语法。找不到问题出在哪里。
  • 是的,我已经注释了我自己的代码,然后复制并粘贴了您的代码。现在,您的代码服务器无法运行。
  • "/home/elgin/Desktop/python/pycharm/django/muplay/music/urls.py",第 2 行,在 中来自 .导入视图文件“/home/elgin/Desktop/python/pycharm/django/muplay/music/views.py”,第 6 行,在 from .forms 导入 AlbumCreateForm 文件“/home/elgin/Desktop/python/pycharm /django/muplay/music/forms.py", line 25 class AlbumCreateForm(forms.ModelForm): ^ SyntaxError: invalid syntax
  • 可以添加最新的表格吗
【解决方案2】:

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

文档

forms.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 将为空。


更新的 album_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 %}

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2023-03-05
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多