我有一個用戶可以更改的設定:自動或手動發送電子郵件。為此,我創建了一個只有 1 行的資料庫,其中包含以下列:
class AutoSendMail(models.Model):
auto = models.BooleanField(default=False)
manual = models.BooleanField(default=True)
send_type = (
('manual', 'MANUAL'),
('auto', 'AUTO')
)
type = models.CharField(max_length=6, choices=send_type, default="manual")
def get(self):
new_self = self.__class__.objects.get(pk=self.pk)
# You may want to clear out the old dict first or perform a selective merge
self.__dict__.update(new_self.__dict__)
return reverse("core:autosend", kwargs={"auto": self.auto})
def reload(self):
new_self = self.__class__.objects.get(pk=self.pk)
# You may want to clear out the old dict first or perform a selective merge
self.__dict__.update(new_self.__dict__)
在此,“自動”或“手動”為 True,另一個為 False。“型別”相應地設定為“自動”或“手動”。此設定用于其余代碼。我現在認為的代碼是:
class AutoSendView(generic.TemplateView):
template_name = 'core/mailbox/autoSendMail.html'
context_object_name = 'autosend'
extra_context = {"mailbox_page": "active"}
model = AutoSendMail.objects.get(id=1)
model.refresh_from_db()
autoSetting = int(model.auto == True)
manualSetting = int(model.manual == True)
def post(self, request, *args, **kwargs):
id_ = self.kwargs.get("pk")
update_type = self.request.POST.get('update_type')
if update_type == 'manual':
logger.info("Set to: manual email send")
model = AutoSendMail.objects.filter(id=1)
model.manual = True
model.auto = False
model.type = "manual"
for object in model:
object.save()
model.reload()
return redirect("core:autosend")
elif update_type == 'auto':
logger.info("Set to: auto email send")
model = AutoSendMail.objects.filter(id=1)
model.manual = False
model.auto = True
model.type = "auto"
for object in model:
object.save()
model.reload()
return redirect("core:autosend")
我的問題是用戶在設定中所做的更改未保存在資料庫中(sqlite3)。我不確定為什么不。因為當我在我的 python 控制臺中嘗試這個時,它確實有效。所以我做錯了什么。
使用上面的代碼,我收到一條錯誤訊息:
ERROR Internal Server Error: /mailbox/autosend
Traceback (most recent call last):
File "C:\Users\Portal\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Portal\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Portal\venv\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "C:\Users\Portal\venv\lib\site-packages\django\views\generic\base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\Portal\venv\lib\site-packages\django\views\generic\base.py", line 101, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\portal\core\views.py", line 200, in post
model.reload()
AttributeError: 'QuerySet' object has no attribute 'reload'
ERROR "POST /mailbox/autosend HTTP/1.1" 500 2657
有人知道如何處理這個問題嗎?當我洗掉“重新加載”時,它會給出錯誤“QuerySet”物件沒有屬性“保存”。如果我也洗掉了“save()”,它不會保存更改
uj5u.com熱心網友回復:
filter(...)將回傳一個查詢集,但 get(...)回傳物件。所以替換:
model = AutoSendMail.objects.filter(id=1)
和
model = AutoSendMail.objects.get(id=1)
備用
我認為您的代碼非常多余且未優化。我認為您可以使用以下代碼:
if update_type == 'auto':
model = AutoSendMail.objects.filter(id=1).update(type="auto", auto=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/451668.html
標籤:Python django sqlite django模型 django-views
上一篇:運行氣流網路服務器時出現氣流錯誤
