django文件上传不起作用

Posted

技术标签:

【中文标题】django文件上传不起作用【英文标题】:django file upload doesn't work 【发布时间】:2017-06-14 14:29:49 【问题描述】:

我正在研究网络应用项目。我的文件上传有问题。 它适用于管理员,但对于普通用户文件不保存。一定是mu views.py或者template html

的问题

    forms.py

    class DocumentUpload(forms.ModelForm):
        class Meta:
            model = Form
            fields = ('file',)
    

    models.py

    class Form(TimeStampedModel, TitleSlugDescriptionModel):
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        title = models.CharField(max_length=512)
        is_final = models.BooleanField(default=False)
        is_public = models.BooleanField(default=False)
        is_result_public = models.BooleanField(default=False)
        file = models.FileField(null=True, blank=True)
    
        def __str__(self):
            return self.title
    
        def get_absolute_url(self):
            return reverse('form-detail', kwargs='slug': self.slug)
    

    views.py

    def create_form(request):
        if request.method == 'POST':
            user = request.user
            data = ParseRequest(request.POST)
            print(data.questions())
            print(data.form())
            parsed_form = data.form()
            parsed_questions = data.questions()
    
            # tworzy formularz o podanych parametrach
            formfile = DocumentUpload(request.POST, request.FILES or None)
            if formfile.is_valid():
                form = formfile.save(commit=False)
                print(form)
                form.author = user
                form.title = parsed_form['title']
                form.is_final = parsed_form['is_final']
                form.is_result_public = parsed_form['is_result_public']
                form.description = parsed_form['description']
                form.save()
                # zapisuje pytania z ankiety wraz z odpowienimi pytaniami
                for d in parsed_questions:
                    question = Question(form=form, question=d['question'])
                    question.save()
                    # dla kazdego pytania zapisz wszystkie opcje odpowiadania
                    for opt in d['options']:
                        option = Option(question=question, option=opt)
                        option.save()
                return render(request, 'forms/form_form.html', )
        else:
            form = DocumentUpload()
            return render(request, 'forms/form_form.html', 'form': form)
    

    create_form.html

        % block content %
        <form method="post" id="form" enctype='multipart/form-data'>
        %csrf_token %
        <div class="form-group">
             % csrf_token %
             <label for="form-title">Tytuł formularza</label>
             <input id="form-title" class="form-control" type="text" 
                                      placeholder="Tytuł" required/>
         </div>
             form.as_p 
        <input class="btn btn-default" type="submit" value="zapisz"/>
        </form>
        % endblock %
    

    5.settings.py

    ....
    DATABASES = 
        'default': 
        'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    ...
    

    5.urls.py

    if settings.DEBUG:
        urlpatterns += 
         static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL, 
             document_root=settings.MEDIA_ROOT)
    

【问题讨论】:

您能分享一下您是如何工作的解决方案吗?我仍然面临这个问题。 【参考方案1】:

您忘记在您的form 上添加action,就像这样:

<form action="% url 'name_of_your_function' %" method="post" id="form" enctype='multipart/form-data'>
...
</form>

action 必须包含您的 url 名称,例如:

url(url_regex, views.function, name="name_of_your_function"),

【讨论】:

我做了,但还是不行。我没有错误,表单只是保存而没有文件。 使用form.is_valid()下的import pdb; pdb.set_trace()检查表单是否通过,它将在您的控制台上显示为(pdb) ...,如果它有效,然后尝试在控制台内部查看什么不起作用一步一步输入下面的代码。 我尝试使用这个调试器,但我没有发现任何错误 @JanekWojciechowski 如果我理解得很好,现在表单会为用户保存所有信息,除了文件,那么这应该是您的媒体配置的问题,您能否告诉我您的 urls.py 和设置。派?你在本地主机上吗? 是的,这是真的,所有信息都正确保存,除了文件。它就像没有文件(它不存在)一样工作。我编辑并添加了部分网址和设置。如果还不够,请告诉我。【参考方案2】:

您尚未在models.py 中为您的FileField 指定upload_to 属性。

为您的字段添加一个目录,例如,

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

您的表单一切正常,文件已通过请求发送,但 Django 不知道将文件保存在哪里,直到您在模型中定义它。

在docs here了解更多信息

【讨论】:

我添加了,所以现在在我的模型中:file = models.FileField(upload_to='media/', null=True, blank=True),我进行了迁移,但仍然不起作用。一切都适用于管理员,所以我认为它知道在哪里保存它。 还有其他想法吗?

以上是关于django文件上传不起作用的主要内容,如果未能解决你的问题,请参考以下文章

仅在 django 中创建基于更新类的视图时,为我的文件上传使用表单集不起作用

Django 2.2静态文件在生产中不起作用(DEBUG False)[重复]

使用 django ajax jquery 提交一个文件不起作用的表单

Pandas 在 django 视图中读取 CSV 不起作用

子进程在 docker 容器中不起作用

使用 NetworkManager 上传文件不起作用