如何覆盖AutoSlugField?

ali*_*lix 1 django django-models django-views

我想要覆盖记录的slug字段.在我看来,我在add_post页面加载时自动创建一条新记录.喜欢:

def add_post(request):
    post=Post(owner=request.user)
    post.save()
    post_id = post.id
    if request.method == 'POST':
        form = add_form(request.POST)
        if form.is_valid():
            form_title = form.cleaned_data['title']
            #other fields

            updated_post = Post.objects.get(id=post_id)
            updated_post.title = form_title
            #save other fields...
            updated_post.save()
Run Code Online (Sandbox Code Playgroud)

我在models.py中有slug_field:

class Post(models.Model):
    owner = models.ForeignKey(User)
    title = models.CharField(max_length=100, blank=True)
    #other fields...
    slug = AutoSlugField(populate_form='title', unique=True)
Run Code Online (Sandbox Code Playgroud)

在我的views.py之后post = Post(owner=request.user); 它创建一个带有默认slug字段名称的记录,因为还没有标题值.

但是,如您所见,我更新了该帖子(添加标题和其他字段).但是slug字段不会自行更新.它仍然是默认的slug名称.

我怎样才能解决这个问题?如果不可能,我将从我的项目中删除AutoSlugField并使用post id.

小智 5

从AutoSlugField文档:

always_update - boolean:如果为True,则每次保存模型实例时都会更新slug.请小心使用,因为很酷的URI不会改变(并且slug通常是对象URI的一部分).请注意,即使该字段是可编辑的,激活此选项时也会丢失任何手动更改.

所以这应该工作:

slug = AutoSlugField(populate_form='title', always_update=True, unique=True)
Run Code Online (Sandbox Code Playgroud)