为什么我的重写保存方法没有在我的django模型中运行?

时间:2015-09-25 10:50:32

标签: python django django-templates slug

我有这个模型

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字段在创建时自行填充。我试图在save方法中使用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然后一切正常。为什么会这样?

2 个答案:

答案 0 :(得分:3)

试试这个:

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

但是如果你想在创作时只填充一次slu ::

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

答案 1 :(得分:2)

slugify方法中,您将调用slug的结果分配给本地变量,而不是实例的slug属性。只需将self.slug替换为{{1}}即可。