我正在使用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”,但该目录中不存在。解决此问题的最佳方法是什么? 谢谢。
答案 0 :(得分:1)
当你说出以下内容时,我感到很困惑:
我期待链接到模型的表单将其上传到 同一地点。
如果您使用ImageField
直接保存模型实例,则您保存的文件最终应在MEDIA_ROOT
中。
这就是Django FileField
默认工作的方式:他们不会向STATIC_ROOT
发送内容。
静态文件明确用于网站内容,而不是用户上传的内容。
您甚至无法将STATIC_ROOT
和MEDIA_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")
我认为更好的问题是:为什么要创建一个您想用来存储静态文件的模型?