表格将图片上传到“静态”时将图片上传到“媒体”文件夹

时间:2017-02-12 21:57:33

标签: django django-models django-forms

我正在使用EventForm让用户编辑事件模型。 在我的模型中,我已经指定了upload_to目录

class Event(models.Model):
    image = models.ImageField(upload_to='event_image')

我期待链接到模型的Form将其上传到同一位置,但是它被上传到媒体 - 我从obj.image.url获得的文件名是'media / filename'。这是我的表格:

class EventForm(forms.ModelForm):
    image = forms.ImageField(label="Event Image", required=True)

    class Meta:
        model = Event

views.py:

def edit_event(request, event_id):
    if request.method == 'POST':
        edited_event = Event.objects.get(id=event_id)
        form = EventForm(request.POST, request.FILES, instance=edited_event)

        if form.is_valid():
            data = form.cleaned_data
            cat = Category.objects.get(name=data["category_str"])

          Event.objects.filter(id=event_id).update(name=data["name"],description=data["description"],address=data["address"],
                                                    volunteerLimit=data["volunteerLimit"],category=cat,minimumAge=data["minimumAge"],
                                                    image=data["image"], date=data['date'])
   return render(request, 'handsup/index.html')

以下是我对媒体和静态根的设置:

STATIC_URL = '/static/'
STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [STATIC_DIR, ]

MEDIA_DIR = os.path.join(BASE_DIR, 'media')
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'

所有模型的图像都上传到“media / event_image”,但修改后的图像上传为“media / filename”,但该目录中不存在。解决此问题的最佳方法是什么? 谢谢。

1 个答案:

答案 0 :(得分:1)

当你说出以下内容时,我感到很困惑:

  

我期待链接到模型的表单将其上传到   同一地点。

如果您使用ImageField直接保存模型实例,则您保存的文件最终应在MEDIA_ROOT中。

这就是Django FileField默认工作的方式:他们不会向STATIC_ROOT发送内容。

静态文件明确用于网站内容,而不是用户上传的内容。

您甚至无法将STATIC_ROOTMEDIA_ROOT设置为相同的目录,因为它们用于不同的目的,如果是这样,Django的设置检查器将抛出错误。 Here's that error in the code

if ((settings.MEDIA_ROOT and settings.STATIC_ROOT) and
            (settings.MEDIA_ROOT == settings.STATIC_ROOT)):
        raise ImproperlyConfigured("The MEDIA_ROOT and STATIC_ROOT "
                                   "settings must have different values")

我认为更好的问题是:为什么要创建一个您想用来存储静态文件的模型?