我是 Django 的初学者,第一次提问:)
我正在遵循一个关于为字符串生成 slug 的简单教程(假设从其标题生成博客文章的 slug)。 也许我遵循的是过时的指南,也许我错过了一些基本的东西,我不知道。
Django 2.0
Python 3.6
我正在尝试执行一项非常简单的任务,即对一个简单的字符串进行slugification,因此:
- 用户以简单形式输入字符串
- 点击“保存”时,标题会经过 slugify 并创建 蛞蝓
- 保存。
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,一切都会正常。为了自动执行此操作,我尝试过:
- 用我的 ModelForm 类重写
save()
方法。 - 重写 CreateView 中的
form_valid()
方法 - 重写模型本身内的
save()
方法。 - 尝试将 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/