我想让用户上传多个图片后。类似于每个产品具有多个图像的电子商务平台。但到目前为止,图像还没有发送到数据库。
这是我目前为止的代码:
网址:models.py
class Project(models.Model):
title = models.CharField(max_length=200)
describtion = models.TextField(null=True, blank=True)
class ProjectImage(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
image = models.FileField(upload_to="products")
字符串
网址:forms.py
class ProjectForm(ModelForm):
image = forms.ImageField(widget=ClearableFileInput(attrs={'multiple':True}))
class Meta:
model = Project
fields = ['title', 'describtion']
型
网址:views.py
def createProject(request):
form = ProjectForm()
if request.method == 'POST':
form = ProjectForm(request.POST)
images = request.FILES.getlist('image')
if form.is_valid():
project = form.save()
for i in images:
ProjectImage(project=project, image=i).save()
context = {'form':form}
return render(request, 'projects/project_form.html', context)
型
project_form.html:
<form class="form" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="form__field">
<label for="formInput#text">{{field.label}}</label>
{{field}}
</div>
{% endfor %}
<input type="submit" name="" id="">
</form>
型
网址:settings.py
STATIC_URL = '/static/'
MEDIA_URL = '/images/'
STATICFILES_DIRS = [
BASE_DIR / 'static'
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/images')
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
型
项目urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('projects.urls')),
]
型
app urls.py
urlpatterns = [
path("", views.createProject, name="create-project")
]
型
2条答案
按热度按时间cetgtptt1#
问题:
1.您创建了
ProjectForm
,它与Project
模型相关,但image
字段位于ProjectImage
模型中。因此,image
字段甚至没有传递给模板,并且您也没有在ProjectFrom
中的fields=['title','describtion']
中传递它。1.您还没有在项目的urls.py中进行保存媒体文件的配置。
解决方案:
1.您应该在forms.py中创建两个表单,第一个
ProjectForm
将获取Project
模型的数据,第二个ProjectImageForm
将获取图像列表,然后使用request.FILES.getlist('image')
可以在循环中逐个保存与特定示例相关的图像。1.您应该在项目的urls.py中进行媒体配置
试试下面的代码:
forms.py
字符串
views.py
型
project_form.html或模板文件:
型
项目的urls.py
型
应用程序的urls.py
型
您的models.py和settings.py可以保持相同,但建议使用
MEDIA_URL = 'media/'
和MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
,然后您应该在其中嵌套文件夹以保存图像或任何文件。Note:
在处理POST数据后,你应该总是返回HttpResponseRedirect
,这个技巧并不特定于Django,它是一个很好的实践,就像tutorial4中所述的那样。Note:
基于函数的视图通常用snake_case
编写,而不是camelCase
,您可以将其从createProject
更改为create_project
。Note:
在ProjectImage
模型的FileField中,将/
作为upload_to='products/'
添加到upload_to末尾。pgccezyw2#
ClearableFileInput不支持“multiple”,可以使用
allow_multiple_selected
。但仍然只允许上传一个项目。这条路适合我
forms.py
字符串