所以我正在尝试制作一个包含一些数据和上传字段的表单。没有forms.py,Django文档没有提供任何好的教程。我不想用它。
我尝试用他的项目修改他们的forms.py(https://docs.djangoproject.com/en/2.2/topics/http/file-uploads/)教程,但是我收到了一个错误。“InMemoryUploadedFile'对象不可调用”我试过在谷歌搜索但我没有发现这个错误。
我显然想念一些东西,因为当我以前用Node做文件上传时我不得不做更多的事情,比如设置文件存储等。我只是不知道如何在django中处理这个问题。那么我错过了什么,为什么我会收到这个错误?
views.py
def incarcarecv(req):
context = {
'title': "title"
}
if req.method == 'POST':
nume = req.POST['nume']
prenume = req.POST['prenume']
telefon = req.POST['telefon']
email = req.POST['email']
CV = req.FILES['CV']
cvUpload = CV(solicitant = req.user, nume=nume, prenume=prenume, telefon=telefon, emailContact=email, CV=CV)
return render(req, "../templates/pagini/incarcare-cv.html", context)
models.py
class CV(models.Model):
solicitant = models.ForeignKey(User, on_delete=models.CASCADE)
dataUploadCV = models.DateField(auto_now_add=True)
nume = models.CharField(max_length=12)
prenume = models.CharField(max_length=12)
telefon = models.CharField(max_length=12)
emailContact = models.EmailField(max_length=40)
CV = models.FileField(upload_to='documents/%d/%m/%Y')
rezolvata = models.BooleanField(default=False)
def __str__(self):
return self.solicitant
HTML
{% extends 'base.html' %}
{% load static %}
{% block content %}
<div class="container container-centru">
<h1 class="heading-contact">Incarca CV</h1>
{% include 'partials/_alerts.html' %}
<form action="{% url 'incarcarecv' %}" method="POST" class="form-contact" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group">
<label for="inputnume" class="email-contact">Nume</label>
<input type="text" name="nume" class="form-control" id="inputnume" aria-describedby="emailHelp" placeholder="Introdu nume">
</div>
<div class="form-group">
<label for="inputprenume" class="email-contact">Prenume</label>
<input type="text" name="prenume" class="form-control" id="inputprenume" aria-describedby="emailHelp" placeholder="Introdu prenume">
</div>
<div class="form-group">
<label for="inputtelefon" class="email-contact">Telefon</label>
<input type="text" name="telefon" class="form-control" id="inputtelefon" aria-describedby="emailHelp" placeholder="Introdu telefon">
</div>
<div class="form-group">
<label for="inputemail" class="email-contact">Email</label>
<input type="email" name="email" class="form-control" id="inputemail" aria-describedby="emailHelp" placeholder="Introdu email">
</div>
<div class="form-group">
<label for="inputcv" class="email-contact">CV</label>
<input type="file" name="CV" class="form-control" id="inputemail" aria-describedby="emailHelp">
</div>
<div class="form-group form-group-custom">
<input type="submit" value="Trimite" class="btn btn-secondary btn-block btn-login-custom">
<input type="submit" value="Resetează câmpurile" class="btn btn-secondary btn-block btn-reset-custom">
</div>
</form>
</div>
{% endblock %}
让我翻译:name =姓氏,prenume =名字,telefon = phone。
那么如何在这种情况下处理文件而不使用forms.py?正如我所说,django没有提供任何相关的教程。
谢谢!
发布于 2019-06-05 12:32:35
在你看来,你的影子在CV
模型中,通过定义一个地方命名的变量CV
。的确,你写道:
CV = req.FILES['CV']
因此,在这种观点,CV
并没有参考模型CV
,但该文件,以后你再调用模型的构造CV(..)
,但这样调用文件处理程序来代替。
def incarcarecv(req):
context = {
'title': 'title'
}
if req.method == 'POST':
nume = req.POST['nume']
prenume = req.POST['prenume']
telefon = req.POST['telefon']
email = req.POST['email']
cv = req.FILES['CV']
cv_upload = CV(
solicitant=req.user,
nume=nume,
prenume=prenume,
telefon=telefon,
emailContact=email,
)
cv_upload.cv.save(cv.name, cv)
cv_upload.save()
return render(req, '../templates/pagini/incarcare-cv.html', context)
您将需要cv_upload.save()
,否则您构造一个CV
对象,但您没有存储在数据库中。
话虽这么说,我强烈建议你使用一个Form
,这里看起来很简单ModelForm
就足够了。表单还可以验证输入,并产生错误,您可以将错误发送给用户。
通过使用PEP-8命名约定,也不太可能发生此类名称冲突。
如果POST请求成功,您还应该重定向到页面。这是Post / Redirect / Get Web开发模式。否则万一提交是成功的,如果你呈现一个页面,用户在浏览器中刷新页面,浏览器会做出同样的POST请求。
https://stackoverflow.com/questions/-100006927
复制相似问题