我目前正在使用自定义html模板,而不是使用我的django应用上的表单来上传特定路径中的img。
应用结构
src/
media/
app/
img/
app_name/
templates/
app_name/
app_template.html
__init__.py
admin.py
apps.py
models.py
tests.py
urls.py
views.py
proj_name/
__init__.py
settings.py
urls.py
wsgi.py
manage.py
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
models.py
class Document(models.Model):
doc_file = models.FileField(upload_to='app/img')
views.py
def app_save(request):
if request.method == 'POST':
newdoc = Document(doc_file=request.FILES.get('myfile'))
newdoc.save()
app_template.html
<form id="myform" method="POST" action="{% url 'my_app:save' %}"
enctype="multipart/form-data">
<input type="file" name="myfile">
<input type="submit">
</form>
提交表单后,我没有任何内部服务器错误,也没有python回溯。但是在app/img
路径中没有上传图像,而在我的数据库中由于newdoc.save()
查询而插入了空白记录。
可以使用没有表单的文件管理吗?
我在forms.py
class UploadFileForm(forms.Form):
file = forms.FileField()
并将我的 app_template.html 更新为:
<form id="myform" method="POST" action="{% url 'my_app:save' %}"
enctype="multipart/form-data">
{{ form.file }}
<input type="submit">
</form>
然后我想在views.py
中加入 app_template.html 的功能:
def index(request):
form = UploadFileForm()
return render(request, 'app_name/app_template.html', { 'form': form })
并将app_save()
功能更新为:
def app_save(request):
form = UploadFileForm(request.POST, request.FILES)
if request.method == 'POST':
if form.is_valid():
newdoc = Document(doc_file=request.FILES.get('file')) # note 'file' is the name of input file of a form.
newdoc.save()
现在的问题是
应用程序中未发现任何错误,但上传的图像文件没有创建media/app/img
路径。想出错?我想我错过了一些东西。
答案 0 :(得分:1)
你的后端代码很好。问题在于前端。您无法像其他字段一样使用jQuery.ajax提交文件输入。使用FormData:
$('#myform').submit(function(event) {
if(window.FormData !== undefined) {
event.preventDefault();
var formData = new FormData(this);
var xhr = new XMLHttpRequest();
xhr.open('POST', $(this).attr('action'), true);
xhr.setRequestHeader('X-REQUESTED-WITH', 'XMLHttpRequest')
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {
result = JSON.parse(xhr.responseText);
// Code for success upload
}
else {
// Code for error
}
}
};
xhr.send(formData);
}
});
答案 1 :(得分:0)
我不明白为什么你不想使用模型形式;它会让事情变得更容易。
但是,如果你真的想在没有它的情况下这样做,你需要自己处理实际的上传。 documentation有一个很好的例子,说明你需要做什么;基本上你只需从{{1}}获取文件并将其保存到你想要的位置。
答案 2 :(得分:0)
ContentFile
中有django.core.files
,使用它来将文件保存为模型字段非常方便。
假设您将一个字段声明为FileField
,并且可能需要创建一个文件并将其附加到该字段中。然后,您可以按照以下步骤进行操作。
from django.core.files.base import ContentFile
from django.db import models
class YourModel(models.Model):
content = models.FileField(upload_to="any_path_or_callable")
...
def save_file(self, content: str):
temp_file = ContentFile(content)
self.content.save(f'{self.pk}.txt', temp_file)
我希望这会对您有所帮助。
谢谢