django文件上传不';行不通

django文件上传不';行不通,django,templates,file-upload,view,image-uploading,Django,Templates,File Upload,View,Image Uploading,我正在研究网络应用程序项目。我上传文件有问题。 它适用于管理员,但不保存常规用户文件。muviews.py或模板html一定有问题 {% block content %} <form method="post" id="form" enctype='multipart/form-data'> {%csrf_token %} <div class="form-group"> {% csrf_token %}

我正在研究网络应用程序项目。我上传文件有问题。 它适用于管理员,但不保存常规用户文件。muviews.py或模板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 %}
  • forms.py

    class DocumentUpload(forms.ModelForm):
        class Meta:
            model = Form
            fields = ('file',)
    
    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})
    
    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})
    
    ....
    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')
    ...
    
    if settings.DEBUG:
        urlpatterns += 
         static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL, 
             document_root=settings.MEDIA_ROOT)
    
  • 型号.py

    class DocumentUpload(forms.ModelForm):
        class Meta:
            model = Form
            fields = ('file',)
    
    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})
    
    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})
    
    ....
    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')
    ...
    
    if settings.DEBUG:
        urlpatterns += 
         static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL, 
             document_root=settings.MEDIA_ROOT)
    
  • 视图.py

    class DocumentUpload(forms.ModelForm):
        class Meta:
            model = Form
            fields = ('file',)
    
    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})
    
    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})
    
    ....
    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')
    ...
    
    if settings.DEBUG:
        urlpatterns += 
         static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL, 
             document_root=settings.MEDIA_ROOT)
    
  • 创建表单.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.url.py

    class DocumentUpload(forms.ModelForm):
        class Meta:
            model = Form
            fields = ('file',)
    
    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})
    
    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})
    
    ....
    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')
    ...
    
    if settings.DEBUG:
        urlpatterns += 
         static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL, 
             document_root=settings.MEDIA_ROOT)
    

  • 您忘记在
    表单上添加
    操作
    ,如下所示:

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

    您尚未在
    models.py
    中为您的
    FileField
    指定
    upload\u to
    属性

    为字段添加一个目录,如

    file = models.FileField(upload_to='uploads/', null=True, blank=True)
    
    您的表单很好,文件已通过请求发送,但Django不知道保存文件的位置,直到您在模型中定义它


    请在

    中阅读更多关于它的信息,我确实这样做了,但仍然不起作用。我没有错误,表单只是保存而没有文件。使用
    导入pdb;pdb.set_trace()
    窗体下。是否有效()
    要检查窗体是否通过,它将在控制台上显示为
    (pdb)…
    ,如果有效,则通过逐步键入下面的代码,尝试查看控制台内部不起作用的内容。我尝试使用此debbuger,但没有看到任何mistake@JanekWojciechowski如果我理解得好的话,现在表单为用户保存了所有信息,除了文件。那么,这应该是媒体配置的问题,您能给我看一下您的URL.py和settings.py吗?您在本地主机上吗?是的,这是真的,所有信息都正确保存,除了文件。它的工作原理就像没有文件一样(它不存在)。我编辑并添加一些URL和设置。如果还不够,请告诉我。我添加了,所以现在在我的模型中:file=models.FileField(上传到class='media/',null=True,blank=True),我进行了迁移,但仍然不起作用。所有东西都适用于管理,所以我认为它知道在哪里保存它。还有其他想法吗?