社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Sarindra Therese • 5 年前 • 1496 次点击  

嘿,我在这个网站上的第一个问题,对不起我的英语。所以我尝试在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
 
1496 次点击  
文章 [ 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>