使用表单上传Django文件

kcugc4gi  于 2022-12-20  发布在  Go
关注(0)|答案(3)|浏览(152)

我正在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)

其形式如下:

def add_form(request):
    form=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})

这就是风景。
现在每次我试图添加一个横幅,我浏览文件,但在我点击“提交”后,它是该文件必须选择,像它不承认我浏览到的表单按钮。

icomxhvb

icomxhvb1#

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

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

并确保在www.example.com中定义了MEDIA_ROOTMEDIA_URLsettings.py
以你的形式

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

lymnna712#

您需要在表单定义中包含enctype="multipart/form-data"

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

tuwxkamq3#

尝试类似这样的操作:
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)

forms.py :

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

views.py :

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")

相关问题