如何从Django中的HTML表单保存图像?

时间:2019-11-12 13:51:05

标签: django django-models django-forms django-templates

class Product(models.Model):
      product_name      = models.CharField(max_length=250)
      product_rate      = models.IntegerField()
      product_date      = models.DateField(auto_now_add=True)
      product_image     = models.ImageField(upload_to='products/')
      product_rules     = models.TextField()
      product_category  = models.ForeignKey(Category,on_delete=models.CASCADE,null=True,blank=True)



def __str__(self):
    return " Name: {} | Date: {}".format(self.product_name,self.product_date)

[这是我的产品型号] 使用此模型,我可以将数据保存到数据库中。我还可以检索数据,然后将其显示到浏览器中。

但是,当我尝试从HTML表单中保存数据时,所有内容都进入了我的数据库,但是我看不到媒体文件夹中的图像。

当我从管理面板保存图像时,可以在媒体文件夹中看到该图像,但不能从HTML表单中看到该图像。

   <input type="file" name="product_image" id="product_image">

这是我的“视图”功能,用于将这些数据保存到数据库中

def addproducts(request):
    if request.method == "POST":
        product_name= request.POST.get('product_name')
        product_rate= request.POST.get('product_rate')
        product_rules= request.POST.get('product_rules')
        product_image = request.POST.get('product_image')
        Product.objects.create(product_name = product_name, product_rate =product_rate, product_rules =product_rules, product_image =product_image)

        return redirect('products')

    else:
        print("error")

    return render(request,'products/addproducts.html')

除该图像外,它均正常工作。但是我仍然可以从ADMIN PANEL中看到图像名称。

我做错了什么? :/

1 个答案:

答案 0 :(得分:1)

您需要手动处理文件,但我不建议您使用。 手动处理POST请求中的数据是不安全的,并且容易出错。

ModelForm是处理此问题的理想方法。

只需创建一个ModelForm类:

class ProductForm(ModelForm):
     class Meta:
         model = Product
         fields = ['product_name', 'product_rate', 'product_rules', 'product_image']

然后只需根据POST数据创建您的Product

def addproducts(request):
    if request.method == "POST":
        form = ProductForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()

        return redirect('products')

    else:
        print("error")

    return render(request,'products/addproducts.html')

form.is_valid()还将检查发送的请求是否有效。