保存Django模型时,做X的正确方法是什么?让我试着解释一下。 :)
例如,我有负责博客文章的模型。我想使用title字段来生成slug字段,如果它尚未设置的话。它应该在模型保存之前发生。这就是我目前实现它的方式。
def save(self, *args, **kwargs):
if self.slug == '':
self.slug = slugify(self.title)
super(Article, self).save(*args, **kwargs)
还有其他办法吗?还有其他方法比这更好吗?
感谢任何建议!
答案 0 :(得分:2)
最合适的方法是覆盖模型的clean
方法:
from django.template import defaultfilters
class Article(models.Model):
...
def clean(self):
if self.slug.strip() == '':
self.slug = defaultfilters.slugify(self.title)
super(Article, self).clean()
在保存模型之前,在完成任何唯一性检查之前,将调用此方法,因此如果出现问题,它仍将被捕获。
您可以阅读有关模型的简洁方法here
答案 1 :(得分:1)
我会将其构建到输入表单中并使用ModelAdmin或ModelForm。
管理员表格:
from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('title', )}
的ModelForm:
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
def clean_slug(self):
if !self.cleaned_data['slug'] :
self.cleaned_data['slug'] = slugify(self.title)
return True
再次在clean_slug中你可能想要检查它是否是唯一的第一个...并且如果不是那么修改slug是唯一的。
答案 2 :(得分:0)
您也可以使用信号。使用django附带的保存后信号。 https://docs.djangoproject.com/en/dev/topics/signals/