我是django的初学者,第一次askig:)
我正在遵循一个简单的教程,以生成字符串的sl,例如,为从其标题生成的博客文章的slug)。也许我正在遵循过时的指南,也许我错过了基本的事情,我不知道。
-
django 2.0
-
python 3.6
我正在尝试执行一个非常简单的任务,以使一个简单的字符串,所以:
- 用户以简单的形式进入字符串
- 击中"保存"时,标题会通过slugify并创建slug
- 保存。
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信号连接到模型。
在所有这四种尝试中,我都得到了相同的结果:
- 用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)