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

时间:2014-05-01 14:29:10

标签: python django

我有两个字段nameurlname类似于“我的群组”,我希望url字段自动从name条目派生。所以它会像“my_group”。

这是我尝试完成此操作的方法,但它不起作用。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

Override您的模型的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)

另见:

另请注意,拥有一个只是模型另一个字段的逻辑转换的字段基本上表明您正在做错事。请考虑在模型上使用property或自定义方法(例如get_url())。

答案 1 :(得分:2)

1)您可以将url转换为模型的@property

name = models.CharField(max_length=140)

@property
def url(self):
    return self.name.replace(" ", "_").lower()

2)override the the model's save方法:

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 则保存到数据库中。实施适合您情况的更好。

答案 2 :(得分:1)

如果你正在使用django admin,你可以将它搞砸。

在您的模型中,您将拥有:

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了解更多