Django 如何更改窗体的HIDDINPUT值
我试图从用户提供的对象标题创建url。我想我可以在表单的Django 如何更改窗体的HIDDINPUT值,django,python-3.x,Django,Python 3.x,我试图从用户提供的对象标题创建url。我想我可以在表单的clean\uurl方法中实现这一点,但它似乎不起作用 def clean_url(self): url = re.sub(r'\W+', '', str(self.cleaned_data['title'])) return url 如何在保存前向表单中添加form.url数据 型号: class Quiz(models.Model): title = models.CharField(
clean\uurl
方法中实现这一点,但它似乎不起作用
def clean_url(self):
url = re.sub(r'\W+', '', str(self.cleaned_data['title']))
return url
如何在保存前向表单中添加form.url
数据
型号:
class Quiz(models.Model):
title = models.CharField(
verbose_name=_("Title"),
max_length=60,
unique=True,
blank=False)
receiver = models.ManyToManyField(
EmployeeType,
blank=True,
verbose_name='Employee Type',
related_name='quiz_receiver')
description = models.TextField(
verbose_name=_("Description"),
blank=True,
help_text=_("A description of the quiz"))
url = models.SlugField(
max_length=60,
blank=False,
unique=True,
help_text=_("e.g. 'blackjackshuffling'"),
verbose_name=_("User friendly URL"))
SlugField
通常不是在ModelForm
中指定的,而是由模型构造的。可以利用以下方法:
class Quiz(models.Model):
# …
url = models.SlugField(
max_length=60,
blank=False,
editable=True,
unique=True,
help_text=_("e.g. 'blackjackshuffling'"),
verbose_name=_('User friendly URL')
)
def save(self, *args, **kwargs):
if self.pk is None:
base_url = url = slugify(self.title)
i = 0
while self._meta.model.objects.filter(url=url).exists():
url = f'{base_url}{i}'
i += 1
self.url = url
super().save(*args, **kwargs)
然后,您可以在模型中指定应从哪个字段填充,并让AutoSlugField
处理其余逻辑:
from autoslug import AutoSlugField
class Quiz(models.Model):
# …
url = AutoSlugField(
populate_from='title',
unique=True
)
从autoslug导入AutoSlugField
课堂测验(models.Model):
# …
url=自动lugfield(
从class='title'填充_,
唯一=真
)
您能分享相关型号吗?通常,这是通过slagify
在模型层完成的。编辑文章。我应该覆盖模型中的save方法吗?出于某种原因,我想我应该创建一个更靠近视图的区域。哦,非常好!我将使用它并覆盖模型保存方法。while
循环是否只是确保不存在两个相同的URL?@DavidAlford:没错,它因此会检查是否已经存在具有给定slug的对象。我对这段代码有疑问。我注意到您在代码之后调用了super().save()
,但是许多方法在之前调用它-有什么区别/用途?@DavidAlford:在将对象保存到数据库之前,您首先设置了slug。如果以后再做,则需要再次保存,以更新数据库端的记录。
from autoslug import AutoSlugField
class Quiz(models.Model):
# …
url = AutoSlugField(
populate_from='title',
unique=True
)