我有两个charfield,name
和url
。name
类似于"我的组",我希望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更多