Django:文件上传与文件创建(上传不工作)

时间:2017-11-01 10:07:18

标签: python django

我有两种形式:一种是你创建一个新对象(然后它为它创建一个新的空文件),另一种是用现有文件创建一个对象(它上传文件)。 创建表单工作正常,它采用新创建的对象的名称并创建具有相同名称的文件并将其上载到静态文件夹中。但是,第二种形式,它告诉你它获得了文件对象和所有内容,但是在任何地方都找不到该文件。

我尝试更改目录并修改代码和所有内容但它似乎根本不起作用,我不知道问题出在哪里,这是我的代码:

views.py:

def create(request):
    print request.POST
    filename = request.POST['name'] 
    f = File(open(filename, "w+"))
    structure = Structure(name=request.POST['name'], file=f)
    structure.save()
    return redirect('/structures')

def upload(request):
    print request.POST
    structure = Structure(name=request.POST['name'], file=request.POST['file'])
    structure.save()
    return redirect('/structures')

models.py:

class Structure(models.Model):
    name = models.CharField(max_length=120)
    file = models.FileField(upload_to='structures')
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self):
        return self.name

html模板:

[...]
<!--CREATE-->
<div class="col-md-12">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="panel-title">Créer une nouvelle structure</h3>
        </div>
        <div class="panel-body">
        <form class="form-horizontal" action="/create", method="post">
        {% csrf_token %}
          <fieldset>
            <div class="form-group">
              <label for="name" class="col-lg-6 control-label">Nom de la structure</label>
              <div class="col-lg-6">
                <input type="text" name="name" id="name">
              </div>
            </div>
            <div class="form-group">
              <div class="col-lg-10 col-lg-offset-2" align="center">
                <button type="submit" value="Create" class="btn btn-primary">Créer</button>
              </div>
            </div>
          </fieldset>
        </form>
        </div>
    </div>
</div>
<!--END-CREATE-->

<!--UPLOAD-->
<div class="col-md-12">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="panel-title">Mettre en ligne une nouvelle structure</h3>
        </div>
        <div class="panel-body">
        <form class="form-horizontal" action="/upload", method="post">
        {% csrf_token %}
          <fieldset>
            <div class="form-group">
              <label for="name" class="col-lg-6 control-label">Structure</label>
              <div class="col-lg-6">
                <input type="text" name="name" id="name"> 
                <label for="structures"></label>
              </div>
            </div>
            <div class="form-group">
              <label for="file" class="col-lg-6 control-label">Fichier de la structure</label>
              <div class="col-lg-6">
                <input type="file" name="file" id="file">
              </div>
            </div>
            <div class="form-group">
              <div class="col-lg-10 col-lg-offset-2" align="center">
                <button type="submit" value="Create" class="btn btn-primary">Créer</button>
              </div>
            </div>
          </fieldset>
        </form>
        </div>
    </div>
</div>
<!--END-UPLOAD-->
[...]

urls.py:

url(r'^create$', views.create),
url(r'^upload$', views.upload),

settings.py:

STATIC_URL = '/static/'
MEDIA_ROOT = 'files/'

以下是上传文件时的服务器日志:

我感谢帮助人员。

<QueryDict: {u'csrfmiddlewaretoken': [u'D8Cz7fUkxbpl2hYb3lmjnzm85jzlMjti'], u'name': [u'doctor list'], u'file': [u'doctors1.ods']}>
[01/Nov/2017 10:10:13]"POST /upload HTTP/1.1" 302 0
[01/Nov/2017 10:10:13]"GET /structures HTTP/1.1" 301 0
[01/Nov/2017 10:10:13]"GET /structures/ HTTP/1.1" 200 8195

顺便说一句:在html模板中我显示了每个对象的文件路径,当我创建对象并创建一个新文件时,路径显示为structures/file.ext,但是当我上传时它,它只显示如下:files.ext

1 个答案:

答案 0 :(得分:1)

你应该改变一些事情:

1-使用表单处理上传:

forms.py

class FileUpload(forms.ModelForm):
    class Meta:
        model = Structure
        fields = ('file', 'name')

views.py

form = FileUpload(request.POST, request.FILES)
if form.is_valid():
    form.save()
    # you can also do some other stuff before saving the form.

2-在表单中添加enctype

改变这个:

<form class="form-horizontal" action="/upload", method="post">

到:

<form class="form-horizontal" action="/upload", method="post" enctype="multipart/form-data">

这可以解决您的问题。

最后一部分: 您正在使用表单上传文件。因此,如果您的文件名已经存在于上传文件夹中,则表单会在文件末尾添加一些随机单词和数字。所以你不能像那样显示文件路径,这可能是错误的。 您可以创建上传文件的实例并获取名称或路径。

它会是这样的:

file = form.save()
# You can get the file url like this:
print(file.file.url)
# Or file path:
print(file.file.path)