Django:根据另一个CharField自动生成CharField

3 投票
3 回答
2881 浏览
提问于 2025-04-18 05:00

我有两个字符字段,分别是 nameurlname 的内容像是 "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())来处理这个问题。

撰写回答