Django:使用来自另一个CharField的数据自动生成CharField



我有两个charfield,nameurlname类似于"我的组",我希望url字段自动从name条目派生。因此,它将类似于"my_group"。

这就是我试图实现这一目标的方式,但没有奏效。

name = models.CharField(max_length=140)
url = models.CharField(max_length=140, default=name.replace (" ", "_"))

有什么想法吗?

覆盖模型的save()方法并在其中设置url字段值:

class MyModel(models.Model):
    name = models.CharField(max_length=140)
    url = models.CharField(max_length=140)
    def save(self, *args, **kwargs):
        self.url = self.name.replace(' ', '_').lower()
        super(MyModel, self).save(*args, **kwargs)

另请参阅:

  • 基于同一模型中另一个字段的Django模型字段默认

还要注意的是,有一个字段只是模型另一个字段的逻辑转换,这基本上是你做事情不正确的标志。考虑在模型上使用property或自定义方法(例如get_url()(。

1(您可以将url转换为模型的@属性:

name = models.CharField(max_length=140)
@property
def url(self):
    return self.name.replace(" ", "_").lower()

2(或者覆盖模型的保存方法:

name = models.CharField(max_length=140)
url = models.CharField(max_length=140)
def save(self, *args, **kwargs):
    self.url = self.name.replace(" ", "_").lower()
    super(ModelName, self).save(*args, **kwargs)

两者的区别在于,在1中,url不会保存到数据库中,而在2则是。请选择更适合您的情况。

如果你使用的是django admin,你可以将其slugify。

在你的模型中,你会有:

name = models.CharField(max_length=140)
slug = models.CharField()

然后在admin.py:

class YourModelAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("name",)}
admin.site.register(YourModel, YourModelAdmin)

参见https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields更多

最新更新