django文件上传不起作用

时间:2017-06-14 14:29:50

标签: django templates file-upload view image-uploading

我正在研究网络应用项目。我有文件上传的问题。 它适用于管理员,但对于常规用户文件不保存。 mu views.py 模板html

一定是个问题
  1. forms.py

    class DocumentUpload(forms.ModelForm):
        class Meta:
            model = Form
            fields = ('file',)
    
  2. 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})
    
  3. 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})
    
  4. 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)
    

2 个答案:

答案 0 :(得分:2)

您忘了在action添加form,就像这样:

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

操作必须包含您的网址名称,例如:

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

答案 1 :(得分:0)

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

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

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

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

docs here

中详细了解相关信息
相关问题