Django:根据另一个CharField自动生成CharField
我有两个字符字段,分别是 name
和 url
。name
的内容像是 "My group",我希望 url
字段能自动根据 name
的内容生成。所以 url
应该变成 "my_group" 这样的形式。
这是我尝试实现这个功能的方法,但没有成功。
name = models.CharField(max_length=140)
url = models.CharField(max_length=140, default=name.replace (" ", "_"))
有没有什么好的建议?
3 个回答
1
如果你在使用Django的后台管理系统,你可以直接把它转换成一个简化的字符串。
在你的模型里,你可以这样写:
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
2
1) 你可以把 url
变成你模型里的一个 @property:
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 中会被保存。你可以根据自己的情况选择更合适的方法。
6
你可以重写你模型的 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()
)来处理这个问题。