如何通过 Django 中的 HTML 表单将图像上传到数据库?
How can I upload an image to database via HTML form in Django?
我正在使用 Django 创建博客。我创建了一个 html 表单,用户可以在其中向 his/her 博客添加标题和内容,并将博客的图像上传到数据库。
HTML表格
<form method="post" action="/addPost" class="container my-4">
{% csrf_token %}
<div class="mb-3">
<label class="form-label">Blog Title</label>
<input type="text" name="blogTitle" required class="form-control">
</div>
<div class="mb-3">
<label class="form-label">Blog Image (Optional)</label>
<input class="form-control" type="file" name="blogImg">
</div>
<div class="mb-3">
<label class="form-label">Blog Content</label>
<textarea class="form-control" name="blogContent" required rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
</form>
当我尝试通过管理面板上传图片时,我可以轻松上传图片,但是当我尝试通过 html 表单上传图片时,我无法上传。
BlogPost 模型
class BlogPost(models.Model):
Sno = models.AutoField(primary_key=True)
Writer = models.ForeignKey(User, on_delete=models.CASCADE)
BlogImage = models.ImageField(upload_to="static/img", blank=True)
BlogTitle = models.CharField(max_length=1000)
BlogContent = models.TextField()
Slug = models.SlugField(default='')
Date = models.DateTimeField()
AddBlogPost 函数
def addPost(request):
if request.user.is_authenticated:
if request.method == "POST":
image = request.POST.get("blogImg")
title = request.POST.get("blogTitle")
content = request.POST.get("blogContent")
user = request.user
slug = str(title).lower().replace(" ", "-")
datetime = now()
BlogPost.objects.create(Writer=user, BlogImage=image, BlogTitle=title, BlogContent=content, Slug=slug, Date=datetime)
return redirect("/")
return render(request, "addBlogPost.html")
else:
return HttpResponse("404 not found")
urls.py 应用
from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("", views.index, name="Main"),
path("addPost", views.addPost, name="addPost"),
path("signup", views.signUp, name="signUp"),
path("logout", views.Logout, name="Logout"),
path("login", views.Login, name="Login"),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
我应该怎么做才能通过html表单上传文件,使它们也保存在静态文件夹中?
基本上我认为你的问题出在你的 html 上,你忘记将 accept="image/*" 添加到你的图片 field.i 就是这样做的,所以它应该可以工作。
<form method="post" action="" class="container my-4">
{% csrf_token %}
<div class="mb-3">
<label class="form-label">Blog Title</label>
<input type="text" name="blogTitle" id="id_blogTitle" required class="form-control">
</div>
<div class="mb-3">
<label class="form-label">Blog Image (Optional)</label> <!--You omitted accept="image/*"-->
<input class="form-control" type="file" name="blogImg" id=id_blogImg accept="image/*">
</div>
<div class="mb-3">
<label class="form-label">Blog Content</label>
<textarea class="form-control" name="blogContent" id="id_blogContent" required rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
</form>
查看您的上传 view.py 我注意到您在该字段中有日期时间,这可能是一个问题,而且我没有将 id 变量放在模板中,当然它也可以不工作。
def addPost(request):
if request.method == "POST":
image = request.POST.get("blogImg")
title = request.POST.get("blogTitle")
content = request.POST.get("blogContent")
slug = str(title).lower().replace(" ", "-")
blog_data = BlogPost(Writer=user, BlogImage=image,
BlogTitle=title, BlogContent=content,Slug=slug)
blog_data.save()
form = BlogPostForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect("/")
return render(request, "addBlogPost.html")
else:
return HttpResponse("404 not found")
好的,我要创建表单来处理博客对象上传,请确保在您的项目中创建 form.py 文件。
class BlogPostForm(form.ModelForm):
class Meta:
model = BlogPost
fields = ['BlogImage',' Writer','BlogTitle','BlogContent','Slug']
您必须在包含 image/file 上传的 html 表单中包含 enctype="multipart/form-data" 属性。
<form method="post" enctype="multipart/form-data" action="/addPost" class="container my-4">
{% csrf_token %}
<div class="mb-3">
<label class="form-label">Blog Title</label>
<input type="text" name="blogTitle" required class="form-control">
</div>
<div class="mb-3">
<label class="form-label">Blog Image (Optional)</label>
<input class="form-control" type="file" name="blogImg">
</div>
<div class="mb-3">
<label class="form-label">Blog Content</label>
<textarea class="form-control" name="blogContent" required rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
</form>
编辑您的 views.py
改变以下
image = request.POST.get("blogImg")
到
image = request.FILES.get("blogImg")
如果不行
您可能还需要将 MEDIA_ROOT & MEDIA_URL 添加到 settings.py 并将您的 url 模式更改为此
urlpatterns = [
path("", views.index, name="Main"),
path("addPost", views.add_post, name="addPost"),
path("signup", views.signUp, name="signUp"),
path("logout", views.Logout, name="Logout"),
path("login", views.Login, name="Login"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我正在使用 Django 创建博客。我创建了一个 html 表单,用户可以在其中向 his/her 博客添加标题和内容,并将博客的图像上传到数据库。
HTML表格
<form method="post" action="/addPost" class="container my-4">
{% csrf_token %}
<div class="mb-3">
<label class="form-label">Blog Title</label>
<input type="text" name="blogTitle" required class="form-control">
</div>
<div class="mb-3">
<label class="form-label">Blog Image (Optional)</label>
<input class="form-control" type="file" name="blogImg">
</div>
<div class="mb-3">
<label class="form-label">Blog Content</label>
<textarea class="form-control" name="blogContent" required rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
</form>
当我尝试通过管理面板上传图片时,我可以轻松上传图片,但是当我尝试通过 html 表单上传图片时,我无法上传。
BlogPost 模型
class BlogPost(models.Model):
Sno = models.AutoField(primary_key=True)
Writer = models.ForeignKey(User, on_delete=models.CASCADE)
BlogImage = models.ImageField(upload_to="static/img", blank=True)
BlogTitle = models.CharField(max_length=1000)
BlogContent = models.TextField()
Slug = models.SlugField(default='')
Date = models.DateTimeField()
AddBlogPost 函数
def addPost(request):
if request.user.is_authenticated:
if request.method == "POST":
image = request.POST.get("blogImg")
title = request.POST.get("blogTitle")
content = request.POST.get("blogContent")
user = request.user
slug = str(title).lower().replace(" ", "-")
datetime = now()
BlogPost.objects.create(Writer=user, BlogImage=image, BlogTitle=title, BlogContent=content, Slug=slug, Date=datetime)
return redirect("/")
return render(request, "addBlogPost.html")
else:
return HttpResponse("404 not found")
urls.py 应用
from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("", views.index, name="Main"),
path("addPost", views.addPost, name="addPost"),
path("signup", views.signUp, name="signUp"),
path("logout", views.Logout, name="Logout"),
path("login", views.Login, name="Login"),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
我应该怎么做才能通过html表单上传文件,使它们也保存在静态文件夹中?
基本上我认为你的问题出在你的 html 上,你忘记将 accept="image/*" 添加到你的图片 field.i 就是这样做的,所以它应该可以工作。
<form method="post" action="" class="container my-4">
{% csrf_token %}
<div class="mb-3">
<label class="form-label">Blog Title</label>
<input type="text" name="blogTitle" id="id_blogTitle" required class="form-control">
</div>
<div class="mb-3">
<label class="form-label">Blog Image (Optional)</label> <!--You omitted accept="image/*"-->
<input class="form-control" type="file" name="blogImg" id=id_blogImg accept="image/*">
</div>
<div class="mb-3">
<label class="form-label">Blog Content</label>
<textarea class="form-control" name="blogContent" id="id_blogContent" required rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
</form>
查看您的上传 view.py 我注意到您在该字段中有日期时间,这可能是一个问题,而且我没有将 id 变量放在模板中,当然它也可以不工作。
def addPost(request):
if request.method == "POST":
image = request.POST.get("blogImg")
title = request.POST.get("blogTitle")
content = request.POST.get("blogContent")
slug = str(title).lower().replace(" ", "-")
blog_data = BlogPost(Writer=user, BlogImage=image,
BlogTitle=title, BlogContent=content,Slug=slug)
blog_data.save()
form = BlogPostForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect("/")
return render(request, "addBlogPost.html")
else:
return HttpResponse("404 not found")
好的,我要创建表单来处理博客对象上传,请确保在您的项目中创建 form.py 文件。
class BlogPostForm(form.ModelForm):
class Meta:
model = BlogPost
fields = ['BlogImage',' Writer','BlogTitle','BlogContent','Slug']
您必须在包含 image/file 上传的 html 表单中包含 enctype="multipart/form-data" 属性。
<form method="post" enctype="multipart/form-data" action="/addPost" class="container my-4">
{% csrf_token %}
<div class="mb-3">
<label class="form-label">Blog Title</label>
<input type="text" name="blogTitle" required class="form-control">
</div>
<div class="mb-3">
<label class="form-label">Blog Image (Optional)</label>
<input class="form-control" type="file" name="blogImg">
</div>
<div class="mb-3">
<label class="form-label">Blog Content</label>
<textarea class="form-control" name="blogContent" required rows="3"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
</form>
编辑您的 views.py 改变以下
image = request.POST.get("blogImg")
到
image = request.FILES.get("blogImg")
如果不行 您可能还需要将 MEDIA_ROOT & MEDIA_URL 添加到 settings.py 并将您的 url 模式更改为此
urlpatterns = [
path("", views.index, name="Main"),
path("addPost", views.add_post, name="addPost"),
path("signup", views.signUp, name="signUp"),
path("logout", views.Logout, name="Logout"),
path("login", views.Login, name="Login"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)