python - 无法在 save() 上修改模型字段

标签 python django django-models django-forms

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

我正在遵循一个关于为字符串生成 slug 的简单教程(假设从其标题生成博客文章的 slug)。 也许我遵循的是过时的指南,也许我错过了一些基本的东西,我不知道。

  • Django 2.0

  • Python 3.6

我正在尝试执行一项非常简单的任务,即对一个简单的字符串进行slugification,因此:

  1. 用户以简单形式输入字符串
  2. 点击“保存”时,标题会经过 slugify 并创建 蛞蝓
  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 信号连接到模型。

在这 4 次尝试中,我得到了相同的结果:

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

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

谢谢!

最佳答案

欢迎来到 StackOverflow。您写了一个构造得非常好的问题(干杯!)

When generating the form with the slug field, I couldn't do anything because it was required.

好吧,首先我们排除 slug,因为我们希望它自动生成。

您可以通过以下方式做到这一点

class TestCreateForm(ModelForm):
    class Meta:
        model = Testmodel
        exclude = ['slug']

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

When generating the form without the slug field, nothing happens when I hit save.

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

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

但这会在每次保存模型时生成 slug。

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

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

关于python - 无法在 save() 上修改模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47739057/

相关文章:

django.db.utils.OperationalError : (1091, "Can' t DROP 'company_id' ;检查列/键是否存在”)

python - Twisted + SQLAlchemy 和最好的方法

python - Kivy:是否可以用类级别(而不是实例)属性触发事件?

python - 无法导入 zc.buildout 中的设置

python - 使用 django cleaned data pop 在提交到 db 之前删除数据

Python/Django - *args 作为列表

python - 类型错误 : Argument 2 must support iteration (even though it does? )

python - 如何将 jinja2 输出渲染到 Python 中的文件而不是浏览器

django - 尝试使用 django View 自动填充字段

Django 对父级的复杂查询