我已经发布了一张表格,在我的视图中,我想添加一个字段。
编辑 slug 字段。这是我决定隐藏在表单中并在视图中自动生成它的slug字段。如何将slug字段附加到表单?
if form.is_valid():
form.[want_to_add_slug_field_here] = slugify(form.cleaned_data['title'])
form.save()
我正在使用(这是为了完全隐藏前端用户的字段,因为我想自动化这些字段。
class LinkForm(forms.ModelForm):
class Meta:
model = Link
exclude = ('pub_date', 'slug', 'posted_by',)
所以这些字段在生成时不在我的表单上。我想在保存之前将这些字段添加到FORM中。这甚至可能吗?
答案 0 :(得分:1)
有很多方法可以解决这个问题(我假设您使用的是ModelForm):
使用表单的clean
方法:
class MyForm(forms.models.ModelForm):
""" This is a form for your model. It includes all fields, but you
won't display the slug field to the user. """
def clean(self):
cleaned_data = self.cleaned_data
cleaned_data["slug"] = slugify(form.cleaned_data["title"])
return cleaned_data
在提交之前将slug添加到模型中:
if form.is_valid():
instance = form.save(commit=False)
instance.slug = slugify(form.cleaned_data["title"])
instance.save()
覆盖模型的保存方法:
class MyModel(models.Model):
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
return super(MyModel, self).save(*args, **kwargs)
使用第三方自动插件字段,例如django-autoslug
我个人使用第四种方式。
答案 1 :(得分:0)
您在寻找:
显示表单时的默认值:
form.fields['slug_field'].initial = slugify(form.fields['title'].value)
默认值,没有来自用户的输入,: 您需要覆盖模型本身的保存方法:
def save(self,*args,**kwargs):
self.slug_name = slugify(self.title)
return super(MyModel,self).save(*args,**kwargs)
答案 2 :(得分:0)
覆盖表单的保存方法,如下所述:how to add the slugified field
如果定期对几个模型进行细分,你也可以考虑在slugify函数周围编写一个包装器,你可以使用pre_save signal来触发它。