如何使用django添加到视图中的FORM?

时间:2011-05-26 10:23:47

标签: django forms views

我已经发布了一张表格,在我的视图中,我想添加一个字段。

编辑 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中。这甚至可能吗?

3 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题(我假设您使用的是ModelForm):

  1. 使用表单的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
    
  2. 在提交之前将slug添加到模型中:

    if form.is_valid():
         instance = form.save(commit=False)
         instance.slug = slugify(form.cleaned_data["title"])
         instance.save()
    
  3. 覆盖模型的保存方法:

    class MyModel(models.Model):
    
        def save(self, *args, **kwargs):
             self.slug = slugify(self.title)
             return super(MyModel, self).save(*args, **kwargs)
    
  4. 使用第三方自动插件字段,例如django-autoslug

  5. 我个人使用第四种方式。

答案 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来触发它。