2011-07-17 107 views
1

我有一個名爲Domain模型,看起來像這樣:排除領域

class Domain(models.Model): 
    """ 
    Model for storing the company domains 
    """ 
    user = models.ForeignKey(
     User 
    ) 
    host = models.CharField(
     null=False, verbose_name="Host", max_length=128, unique=True 
    ) 

我想使用Django的通用視圖對這個做CRUD操作。此模型中有一個字段需要用戶輸入,但外鍵字段不需要任何用戶輸入。如何從通用視圖生成的表單中排除該字段,併爲其分配當前通過身份驗證的用戶的值。

謝謝。

回答

2

看看羅素對本週早些時候的django-users group上類似問題的回答。

引用答案*:

表單和視圖解決不同的問題。

該視圖解決了「我如何處理此請求並將其轉換爲響應?」的問題。該表格解決了如何將此請求中的POST數據轉換爲模型對象(或將 更改爲模型對象)的問題?「。

大致來說,一個視圖執行下列操作:

  1. 查看得到的請求
  2. 查看作品出來,這是否是一個GET或POST
  3. 如果它的一個帖子,查看詢問表格將帖子轉換爲模型更改
  4. 表單返回成功或失敗
  5. 視圖響應表單的成功或失敗。
  6. 查看返回響應。

窗體的功能觀的 功能的完整的子集 - 基於這個原因,它是一個完全 互換內部組件。

現在,在簡單的情況下,有可能爲視角的猜測所有的 默認值的形式 - 它需要知道的一切是你正在處理 有一個Foo模型,它可以構造一個默認的Foo的ModelForm。 但是,如果你有更復雜的表單要求,你需要一個自定義表單 。

我們可能已通過在View類上公開所有選項 ModelForm來實現此目的;但爲了保持一切清潔,我們 保持ModelForm獨立,並提供了一種方式來指定要使用哪個Form類的視圖。

所以 - 覆蓋排除領域的你的使用情況,您可以定義一個 的ModelForm排除字段,然後讓CreateView的知道你要使用的 形式:

class CampaignForm(forms.ModelForm): 


    class Meta: 
     model = Campaign 
     exclude = ('user', 'name', 'content_inlined') 

class CreateCampaignView(CreateView): 
    form_class = CampaignForm 
    template_name = "forms/create.html" 

我當你說「修正某個字段的值」時,你的猜測是,在保存新的 Campaign實例之前,你的意思是設置 用戶,名稱和content_inlined的值;要做到這一點,你需要注入一些額外的代碼到 表格的形式處理邏輯:

class CreateCampaignView(CreateView): 
    form_class = CampaignForm 
    template_name = "forms/create.html" 

    def form_valid(self, form): 
     form.instance.user = ... (something meaningful.. e.g., self.request.user) 
     return super(CreateCampaignView, self).form_valid(form) 

這將覆蓋默認行爲時,形式是有效的,並設置 多餘的值。 form_valid()的super()實現然後將 保存實例。但是,如果你這樣做,你失去了 請求對象,而如果你想你需要 -

根據記錄,這也可以通過重寫保存()方法 上的ModelForm完成將 實例值設置爲請求敏感的內容。

*原始回答集self.object.user而不是form.instance.user。這給了一個AttributeError,所以我已經改變了上面。