gpt4 book ai didi

python - Django:文件上传与文件创建(上传不起作用)

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:31 25 4
gpt4 key购买 nike

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

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

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

模型.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-->
[...]

url.py:

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

设置.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模板中,我显示每个对象的文件路径,当我创建对象并因此创建新文件时,路径显示如下 structurals/file.ext 但当我上传它时,它只显示如下: files.ext

最佳答案

嗯,有几件事你应该改变:

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)

关于python - Django:文件上传与文件创建(上传不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47052385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com