Py学习  »  Django

如何用modelform更新django 2.1中的图像?[复制品]

Sarindra Therese • 5 年前 • 1382 次点击  

嘿,我在这个网站上的第一个问题,对不起我的英语。所以我尝试在django框架中的模型上上传一个文件。

class banner(models.Model):
#id is made by Django
name = models.CharField(max_length=255)
created_by = models.CharField(max_length=255)
company = models.CharField(max_length=255)
register_date = models.DateField(auto_now_add=True)
file = models.FileField(null=True, blank=True)
file_name = models.CharField(max_length=255)

这是模型

class BannerForm(forms.Form):
name=forms.CharField(max_length=255)
created_by=forms.CharField(max_length=255)
company=forms.CharField(max_length=255)
data_type=forms.CharField(max_length=255)
register_date=forms.DateField()
file=forms.FileField()
file_name=forms.CharField(max_length=255)

这是表格

定义添加表单(请求): 表单=bannerform() last=models.banner.objects.all().last()

if request.method == "POST":
    form = forms.BannerForm(request.POST, request.FILES or None)
    if form.is_valid():
        form.cleaned_data['created_by']
        new_banner=models.banner()
        new_banner.id=last.id+1
        new_banner.name=form.cleaned_data['name']
        new_banner.register_date=form.cleaned_data['register_date']
        new_banner.company=form.cleaned_data['company']
        new_banner.file=form.cleaned_data['file']
        new_banner.file_name=new_banner.file.name
        new_banner.created_by=form.cleaned_data['created_by']
        new_banner.save()

return render(request, "add_banner.html",{"form":form})

这是视图。现在每当我试图添加一个横幅。我浏览文件,但在我按下提交后,它是必须选择的文件,就像它不识别我浏览到的表单按钮。有什么建议吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/42986
 
1382 次点击  
文章 [ 3 ]  |  最新文章 5 年前
user6089877
Reply   •   1 楼
user6089877    7 年前

试试这样:

Models.py:

class banner(models.Model):
#id is made by Django
name = models.CharField(max_length=255)
created_by = models.CharField(max_length=255)
company = models.CharField(max_length=255)
register_date = models.DateField(auto_now_add=True)
file = models.FileField(upload_to='files/', null=True, blank=True)
file_name = models.CharField(max_length=255)

PYS:

class BannerForm(forms.ModelForm):
    class Meta:
        model = banner #Or Banner ??
        fields = ('name', 'created_by', 'company', 'file', 'file_name' )

查看:

from myapp.forms import BannerForm

if request.method == "POST":
    form = BannerForm(request.POST, request.FILES)
    if form.is_valid():
        entry = form.save(commit=False)
        entry.name = request.POST['name']
        entry.created_by = request.POST['created_by']
        entry.company = request.POST['company']
        entry.file_name = request.POST['file_name']
        form.save()

    else:
      form = BannerForm()

return render(request, "add_banner.html",locals())

如前所述,不要忘记:

<form method="POST" action="" enctype="multipart/form-data">
    {% csrf_token %}
    {{form.name}}
    {{form.created_by}}
    {{form.company}}
    {{form.file_name}}
    {{form.file}}
    <input type="submit">
</form>

您不必指定这些内容:

new_banner.file=form.cleaned_data['file']

new_banner.register_date=form.cleaned_data['register_date'] ->无用,因为在您的模型中,您设置了auto_now_add=true,所以您不需要在HTML表单中生成字段。

注:如果你的领域 created_by = models.CharField(max_length=255) 是放置现有用户,因此您应该将外键字段设置为:

from django.contrib.auth.models import User
created_by = models.ForeignKey(User, verbose_name="Created by")
The_Cthulhu_Kid
Reply   •   2 楼
The_Cthulhu_Kid    7 年前

你需要包括 enctype="multipart/form-data" 在你的表单定义中。

<form method="post" action="your action" enctype="multipart/form-data">
    {% csrf_token %}
    ...
</form>
Exprator
Reply   •   3 楼
Exprator    7 年前

你需要在你的模型中指定上传路径

file = models.FileField(null=True, blank=True,upload_to='files')

确保你有 MEDIA_ROOT MEDIA_URL 在您的设置中定义.py

以你的形式

<form method="post" action="" enctype="multipart/form-data">
    {% csrf_token %}
    ...
</form>