2011-05-26 33 views
0

我已經發布了一個表單,並且在我的視圖中我想添加一個字段。如何使用django添加到視圖中的FORM?

編輯slu 012字段。這是我決定隱藏在窗體中的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中,這是否可能呢?

回答

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. commiting前添加蛞蝓到模型:

    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. 使用第三方autoslug領域,例如django-autoslug

我個人使用的4路。

+0

很好的迴應。因爲你可以看到它不僅僅是slu field隊。我還希望能夠在保存之前操作其他字段,例如'posting_by'。我不想重寫def save,因爲我希望管理表單仍然是默認的。 – darren 2011-05-26 11:11:13

+0

然後第二種方法應該適合你。 – 2011-05-26 11:13:20

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) 
+0

這裏假設slug_field是根據請求表單的一部分。我想要添加一個字段到表單對象。 – darren 2011-05-26 11:12:20

+0

對不起,我錯過了。 @ andrey-fedoseev的答案絕對是你要找的。 – Narsilou 2011-06-02 21:06:31

0

覆蓋形式的保存方法如下所示:how to add the slugified field

如果您定期炸開字段和幾個模型,您還可以考慮編寫一個包裝器aroun d您可以通過pre_save signal觸發的slugify功能。

+0

謝謝。我更新了我的問題,表明它不僅是我試圖操縱的slug字段。 – darren 2011-05-26 11:11:47

相關問題