[英]Python37 and Django 2 TextField not a string?
我們決定將python 2.7.15的django 1.10.5項目遷移到python和django的較新版本。 現在我們正在使用python 3.7和django2。在電子郵件發送腳本出現問題之后,我發現了一些奇怪的地方。 在發送自動郵件時,我們從數據庫中的TextField提取了文本並將其插入到我們的Mail中。
content = content.replace('##ENTRY##', entry.text)
輸入的文本字段是django models.TextField。 現在有了python 37,它不允許我那樣使用它。 我必須將entry.text包裝到str()中。 但是TextField不應該是字符串嗎?
content = content.replace('##ENTRY##', str(entry.text))
有了它就可以了,但是那樣做會讓我的肚子受傷,因為我不明白為什么。
編輯:
def send_task_entry_new(entry):
content = Email.load_email_template('tasks.watcher.info.entry.new')
content = content.replace('##TAG##', entry.task.get_tag())
content = content.replace('##ENTRY##', entry.text)
content = content.replace('##SUBJECT##', entry.task.get_subject())
subject = entry.task.get_tag() + " " + entry.task.get_subject()
for watcher in entry.task.taskwatcher_set.all():
if watcher.user.last_login:
content = content.replace('##LINK##', settings.BASE_URL + entry.task.get_absolute_url())
# If User has never logged in (Dummy for external task user)
else:
content = content.replace('##LINK##', settings.BASE_URL + reverse('tasks_public', args=[watcher.token]))
Email.send(watcher.user.email, '', '', subject, content)
Entry是一個TaskEntry對象,我創建一個Task后即會創建它。 TaskEntry模型如下所示。 至少一個TaskEntry的屬性:
task = models.ForeignKey(Task, null=True, on_delete=models.SET_NULL)
creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
external = models.EmailField(null=True, blank=True)
text = models.TextField(verbose_name="Text")
date_created = models.DateTimeField(auto_now_add=True)
編輯流程:
電子郵件進入並得到處理:
text = get_decoded_email_body(response_part[1])
觸發:
def get_decoded_email_body(message_body):
msg = email.message_from_bytes(message_body)
if msg.is_multipart():
# Walk through all parts of this email
for part in msg.walk():
# print "%s => %s" % (part.get_content_type(), part.get_content_charset())
charset = part.get_content_charset()
#TODO umstellung auf Python3 enfernen und testen
if part.get_payload(decode=True):
if part.get_content_type() == 'text/plain':
if charset:
return str(part.get_payload(decode=True), charset, 'ignore')
else:
return to_unicode(part.get_payload(decode=True))
if part.get_content_type() == 'text/html':
if charset:
return str(part.get_payload(decode=True), charset, 'ignore')
else:
return to_unicode(part.get_payload(decode=True))
return "Email has no text/plain or text/html part"
else:
return to_unicode(msg.get_payload(decode=True))
之后,我們提取了文本並創建了一個now任務:
user = User.objects.get_or_create(email=sender)[0]
task = Task.objects.create(subject=subject, creator=user)
task.create_entry(text, user) #Here it crashes
Email.send_task_operators_new_task(task, text, sender)
現在進入models.py,然后進入create_entry:
def create_entry(self, text, creator):
entry = TaskEntry()
entry.text = text
entry.task = self
entry.creator = creator
entry.save()
if creator:
TaskWatcher.objects.get_or_create(task=self, user=creator)
下一步是.save()方法:
def save(self, *args, **kwargs):
if self.pk == None:
created = True
else:
created = False
super(TaskEntry, self).save(*args, **kwargs)
if created:
# If this entry is the first one inform creator and owner if given
if self.task.taskentry_set.all().count() == 1:
Email.send_task_created_to_creator(self.task)
# If a owner has been given how is not the creator
if self.task.owner and self.task.owner != self.task.creator:
Email.send_task_created_to_owner(self.task)
# This is not the first entry, so inform all watcher about the new entry
if self.task.taskentry_set.all().count() > 1:
Email.send_task_entry_new(self)
現在,它執行Email.send_task_entry_new(self)並引發replace()錯誤。
多虧了Daniel Roseman,我發現了問題。 由於我將郵件中的有效負載作為字節,並且從不將其轉換為字符串,因此將其作為字節保存到數據庫中。 一旦我從數據庫請求數據,它就是字節,我必須根據需要將它們轉換為字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.