我是Django的初学者,第一次询问:)
我正在关注一个关于为字符串生成slug的简单教程(比如说,从其标题生成的博客帖子中有一个slug)。 也许我正在追踪一个过时的指南,也许我错过了一个基本的东西,我不知道。
Django 2.0
Python 3.6
我正在尝试执行一个非常简单的强制简单字符串的任务,所以:
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,直到这里everythig工作。为了自动完成,我尝试过:
save()
方法。form_valid()
方法
save()
方法。在所有这4次尝试中,我得到了相同的结果:
我发现避免此问题的唯一方法是将slug字段设置为blank = True
。我不确定它有多安全?
谢谢!
答案 0 :(得分:1)
欢迎使用StackOverflow。你写了一个奇妙的构造问题(干杯!)
当使用slug字段生成表单时,我无法执行任何操作,因为它是必需的。
好的,首先我们要讨论slug,因为我们希望它能够自动生成。
您可以通过
执行此操作class TestCreateForm(ModelForm):
class Meta:
model = Testmodel
exclude = ['slug']
现在你将获得一个没有slug字段的表单。
当生成没有slug字段的表单时,当我点击save时没有任何反应。
现在我们覆盖模型本身的save()
函数,因为slug是模型的一部分。
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
但是每次保存模型时都会产生slu ..
我们可以更进一步确保只有在“创建”模型时才设置slug,而不是每次“更新”时都设置slug
def save(self, *args, **kwargs):
if not self.id:
self.slug = slugify(self.title)
super().save(*args, **kwargs)