Skip to main content
 首页 » 编程设计

python之为什么我覆盖的保存方法没有在我的 Django 模型中运行

2025年05月04日36linjiqin

我有这个模型

class Clinic(models.Model): 
    name = models.CharField(max_length=100) 
    email = models.EmailField(blank=True) 
    website = models.URLField(blank=True) 
    phone_number = PhoneNumberField(blank=True) 
 
    slug = models.SlugField(blank=True) 
    delivery = models.BooleanField() 
 
    def __str__(self): 
        return self.name 
 
    def get_absolute_url(self): 
        return reverse('clinic_detail', kwargs={'slug': self.slug}) 
 
    def save(self, *args, **kwargs): 
        slug = slugify(self.name) 
        super(Clinic, self).save(*args, **kwargs) 

我正在尝试让 slug 字段在创建时自行填充。我试图在保存方法中使用 slugify 函数来执行此操作,但由于某种原因,当我从 Django 管理员创建诊所对象时,我定义的保存函数没有运行。当我尝试从我在此模板中生成的列表中访问诊所对象时

<ul> 
{% for clinic in object_list %} 
    <li><a href="{{clinic.get_absolute_url}}">{{clinic.name}}</a></li> 
{% empty %} 
    <li>No clinics available</li> 
{% endfor %} 
</ul> 

我得到一个错误,因为没有可用的 slug,所以 get_absolute_url 失败了。

如果我然后返回管理员并手动添加一个 slug,那么一切正常。为什么会这样?

请您参考如下方法:

试试这个:

def save(self, *args, **kwargs): 
    self.slug = slugify(self.name) 
    super(Clinic, self).save(*args, **kwargs) 

但是如果你只想在创建时填充 slug 一次:

def save(self, *args, **kwargs): 
    if not self.pk: 
        self.slug = slugify(self.name) 
    super(Clinic, self).save(*args, **kwargs)