【问题标题】:Why is my overridden save method not running in my django model?为什么我的覆盖保存方法没有在我的 django 模型中运行?
【发布时间】:2015-12-23 04:32:32
【问题描述】:

我有这个模型

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,那么一切正常。为什么会这样?

【问题讨论】:

    标签: python django django-templates slug


    【解决方案1】:

    试试这个:

    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)
    

    【讨论】:

      【解决方案2】:

      在您的save() 方法中,您将对slugify 的调用结果分配给一个局部变量,而不是您的实例的slug 属性。只需将slug 替换为self.slug 即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        相关资源
        最近更新 更多