首页 > 解决方案 > 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 字段,而不必在视图中执行此操作。但是,在当前格式中,请求没有“传递”给模型,我不确定我应该如何做到这一点。

这是我目前得到的:

名称“请求”未定义

标签: djangodjango-models

解决方案


程序逻辑应该在视图中处理,并且在您的模型中应该只使用数据库或模型相关的东西(原因是视图正是为此而制作的)。所以你可以更好地做到这一点,因为,

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

推荐阅读