Django形成ImageField

时间:2017-12-12 17:50:41

标签: python django django-forms imagefield

我试图为拥有ImageField的模型建立CreateView。我可以从django管理页面成功上传和显示图像。但是,当我从我自己的表单上传图片时,django不会将图片上传到" upload_to"夹。我在下面写下我的代码:

models.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 %}

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

2 个答案:

答案 0 :(得分:1)

我通过指定&#34; enctype&#34;更改了album_create.html。 &#34;形式的属性&#34;标记如django文档中所述,我的问题已解决。

<强>文档

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 [&#39; file&#39;]访问。

请注意,如果请求方法是POST,则request.FILES将仅包含数据,并且发布请求的具有属性enctype =&#34; multipart / form-data&#34;。否则,request.FILES将为空。

UPDATED 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 %}

答案 1 :(得分:0)

这可以帮助你

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 =&#34;多部分/格式数据&#34;

相关问题