django - Django:覆盖预定义的 save() 方法 - 未定义请求
问题描述
我正在尝试覆盖Django 模型上的 save() 方法,以便自动填写一些字段。这是模型:
class Blog(models.Model):
title = models.CharField(max_length=200)
user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True)
url = models.CharField(max_length=1500, null=True, blank=True)
ip = models.CharField(max_length=200, null=True, blank=True)
content = models.TextField(null=True, blank=True)
def save(self, *args, **kwargs):
if request.user:
self.user = request.user
self.url = request.path
self.ip = socket.gethostbyname(socket.gethostname())
super().save(*args, **kwargs)
我要做的是在保存记录时自动设置用户、URL 和 IP 字段,而不必在视图中执行此操作。但是,在当前格式中,请求没有“传递”给模型,我不确定我应该如何做到这一点。
这是我目前得到的:
名称“请求”未定义
解决方案
程序逻辑应该在视图中处理,并且在您的模型中应该只使用数据库或模型相关的东西(原因是视图正是为此而制作的)。所以你可以更好地做到这一点,因为,
if request.user.is_authenticated():
blog = Blog.objects.create(user_id=request.user.id, url=request.path, ip=socket.gethostbyname(socket.gethostname()))
如果您特别想访问模型中的请求(无论如何都不应该这样做),只需将其作为 kwarg 发送即可。
Blog.objects.save(req=request)
并将其捕获为,
def save(self, *args, **kwargs):
request = kwargs.get('request', None)
if request:
if request.user.is_authenticated():
self.user = request.user
self.url = request.path
推荐阅读
- html - 如何在 ::before 容器中使用 ::after div?
- postgresql - Heroku Postgres 备份
- delphi - 有没有一种快速的方法来找出 Embarcadero 单元是在哪个运行时包中实现的?
- sql - 有没有办法查询引用先前期间结果列的表?
- javascript - 仅当对象 2 中的 id 存在于纯 Javascript 中的对象 1 中时才合并两个对象
- date - RxSwift 从字符串转换后按日期排序
- postgresql - PostgreSQL vs Kubernetes 性能问题
- django - 为什么 celery 可以使用“--concurrency 1 -P solo”而不是没有?
- javascript - 无法在 p5.js 中获取麦克风输入
- python - 使用 pysnmp 检索打印机碳粉信息