gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:10 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com