python - Django:将上传文件中的文本写入文本字段
问题描述
我有以下模型:
class Clean(models.Model):
name = models.CharField(max_length=100)
cv = models.TextField(max_length=10000)
cvfile = models.FileField()
当用户从表单提交名称和文件时,我正在尝试写入内容cvfile
。cv
我确信这可以完成,因为文件和文本字段将在同一个对象中。该文件将始终为 .txt ,因此我假设可以执行一个简单的 .read() 。
我应该有一个表单调用的函数来执行这个吗?如果是这样,如何做到这一点?
def writeCV(self):
get_text = cvfile.open().read()
#write to cv field somehow
return self.cv
我正在使用 django 1.9
从 Messaoud 的回答中追溯:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/cleaner/clean/add/
Django Version: 1.9
Python Version: 3.6.4
Installed Applications:
['cleaner.apps.CleanerConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "C:\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in view
68. return self.dispatch(request, *args, **kwargs)
File "C:\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in dispatch
88. return handler(request, *args, **kwargs)
File "C:\Python\Python36-32\lib\site-packages\django\views\generic\edit.py" in post
255. return super(BaseCreateView, self).post(request, *args, **kwargs)
File "C:\Python\Python36-32\lib\site-packages\django\views\generic\edit.py" in post
221. return self.form_valid(form)
File "C:\Python\Python36-32\lib\site-packages\django\views\generic\edit.py" in form_valid
200. self.object = form.save()
File "C:\Python\Python36-32\lib\site-packages\django\forms\models.py" in save
451. self.instance.save()
File "C:\Users\barry\Desktop\College\Year 4\Semester 2\cvCleaner\cvcleaner\cleaner\models.py" in save
11. get_text = self.cvfile.open().read()
Exception Type: AttributeError at /cleaner/clean/add/
Exception Value: 'NoneType' object has no attribute 'read'
解决方案
你可以通过覆盖save
你的方法来做到这一点Model
class Clean(models.Model):
name = models.CharField(max_length=100)
cv = models.TextField(max_length=10000, blank = True, null = True)
cvfile = models.FileField()
def save(self, *args, **kwargs):
get_text = self.cvfile.open().read()
self.cv = get_text
super(Clean, self).save(*args, **kwargs) # Call the "real" save() method.
或者通过使用post_save信号
def writeCV(sender, instance, **kwargs):
get_text = instance.cvfile.open().read()
instance.cv = get_text
instance.save()
post_save.connect(writeCV, sender=Clean)
推荐阅读
- ios - Bundle(标识符:“org.cocoapods.MyPrivatePod”)返回零
- java - 解决Java堆空间错误当向double Arraylist添加新值时
- heroku - Heroku:无法升级评论应用程序
- python - 在尝试最大化函数时,索引 1 超出轴 0 的范围,大小为 1
- javascript - 根据内容可编辑更改窗口标题
- django - 尝试访问 Google Cloud Run 中的容器时出现错误请求 (400)(系统调用不受支持)
- google-maps - 将 OnEdit 添加到脚本或在计算 Google 表格中的单元格后停止运行脚本?服务调用太多次尝试 Utilities.sleep(1000)
- neutralinojs - 如何让 NeutralinoJS 在 Mac OS X 中工作?
- sql - 在 Oracle 中从头开始重新分区表
- javascript - d3 - 使用鼠标滚轮缩放时禁用滚动?