无法修改save()

时间:2017-12-10 12:55:54

标签: python django django-models django-forms

我是Django的初学者,第一次询问:)

我正在关注一个关于为字符串生成slug的简单教程(比如说,从其标题生成的博客帖子中有一个slug)。 也许我正在追踪一个过时的指南,也许我错过了一个基本的东西,我不知道。

  • Django 2.0

  • Python 3.6

我正在尝试执行一个非常简单的强制简单字符串的任务,所以:

  1. 用户以简单的形式输入字符串
  2. 当点击“保存”时,标题会经过slugify并创建 蛞蝓
  3. 保存。
  4. models.py

    from django.db import models    
    
    class Testmodel(models.Model):
        title = models.CharField(max_length=220)
        slug = models.SlugField(unique=True, null=True)
    
        def __str__(self):
            return self.title
    

    views.py

    from django.views.generic.edit import CreateView    
    
    class TestCreate(CreateView):
        model = Testmodel
        fields = '__all__'
    

    forms.py

    from django.forms import ModelForm
    from .models import Testmodel
    
    class TestCreateForm(ModelForm):
        class Meta:
            model = Testmodel
            fields = '__all__'
    

    如果我手动进入slug,直到这里everythig工作。为了自动完成,我尝试过:

    1. 使用我的ModelForm类覆盖save()方法。
    2. 覆盖CreateView
    3. 中的form_valid()方法
    4. 覆盖模型本身的save()方法。
    5. 尝试将pre_save信号连接到模型。
    6. 在所有这4次尝试中,我得到了相同的结果:

      • 当使用slug字段生成表单时,我无法执行任何操作,因为它是必需的。
      • 生成没有slug字段的表单时,点击save时没有任何反应。

      我发现避免此问题的唯一方法是将slug字段设置为blank = True。我不确定它有多安全?

      谢谢!

1 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow。你写了一个奇妙的构造问题(干杯!)

  

当使用slug字段生成表单时,我无法执行任何操作,因为它是必需的。

好的,首先我们要讨论slug,因为我们希望它能够自动生成。

您可以通过

执行此操作
class TestCreateForm(ModelForm):
    class Meta:
        model = Testmodel
        exclude = ['slug']

现在你将获得一个没有slug字段的表单。

  

当生成没有slug字段的表单时,当我点击save时没有任何反应。

现在我们覆盖模型本身的save()函数,因为slug是模型的一部分。

def save(self, *args, **kwargs):
    self.slug = slugify(self.title)
    super().save(*args, **kwargs)

但是每次保存模型时都会产生slu ..

我们可以更进一步确保只有在“创建”模型时才设置slug,而不是每次“更新”时都设置slug

def save(self, *args, **kwargs):
    if not self.id:
        self.slug = slugify(self.title)
    super().save(*args, **kwargs)