无法修改保存()上的模型字段



我是django的初学者,第一次askig:)

我正在遵循一个简单的教程,以生成字符串的sl,例如,为从其标题生成的博客文章的slug)。也许我正在遵循过时的指南,也许我错过了基本的事情,我不知道。

  • django 2.0

  • python 3.6

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

  1. 用户以简单的形式进入字符串
  2. 击中"保存"时,标题会通过slugify并创建slug
  3. 保存。

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手动。为了自动进行,我尝试了:

  1. 用我的Modelform类覆盖save()方法。
  2. 在Createview中覆盖form_valid()方法
  3. 在模型本身中覆盖save()方法。
  4. 试图将pre_save信号连接到模型。

在所有这四种尝试中,我都得到了相同的结果:

  • 用slug字段生成表格时,我什么都不做,因为它是必需的。
  • 在没有slug字段的情况下生成表单时,当我击打保存时什么都不会发生。

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

谢谢!

欢迎使用stackoverflow。您已经写了一个很棒的构建问题(欢呼!)

用slug字段生成表格时,我什么都不做,因为它是必需的。

好吧,所以首先我们要弹出sl,因为我们希望将其自动化。

您可以通过

做到这一点
class TestCreateForm(ModelForm):
    class Meta:
        model = Testmodel
        exclude = ['slug']

现在您将获得一个没有slug字段的表格。

在没有slug字段的情况下生成表单时,当我点击保存时,什么也不会发生。

现在,我们覆盖模型本身的save()功能,因为SLUG是模型的一部分。

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

,但每次保存模型时都会生成sl。

我们可以更进一步,并确保仅当模型是"创建"的,而不是每次"更新"

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

最新更新