2012-05-30 35 views
5

請將此作爲考慮問題。也許有人會使用下面的 解決方案之一。Django用戶HiddenInput與使用基於類的視圖直接保存在視圖中

我有幾個模型,其中包含一個ForeignKey(User)字段。 我的基於類的創建視圖來自通用CreateView

有兩個選項添加新對象時保存相關聯的用戶:

  1. 保存在通過重寫form_valid方法的意見的形式; 這並不暴露user_id(和其他此處未提及,不應該暴露數據)

    class CreateOfferView(CreateView): 
    
        model = Offer 
        form_class = SomeModelFormWithUserFieldExcluded 
    
        def form_valid(self, form): 
         instance = form.save(commit=False) 
         instance.user = self.request.user 
         instance.save() 
    
  2. 與保存在一個隱藏字段存儲(和曝光)的用戶ID的形式。 這是棘手的部分。有更多的模型與用戶字段...所以 創建表單時,我需要用初始(當前登錄)用戶填充用戶字段,我也需要使該字段隱藏。爲了這個目的,我用我的OwnFormMixin

    class OwnFormMixin(object): 
    
        def get_form(self, form_class): 
         form = super(OwnFormMixin, self).get_form(form_class) 
         form.fields['user'].widget = forms.HiddenInput() 
    
        def get_initial(self): 
         initial = super(OwnFormMixin, self).get_initial() 
         initial['user'] = self.request.user.pk 
         #I could also do this in get_form() with form.fields['user'].initial 
    
    class CreateOfferView(OwnFormMixin, CreateView): 
        model = Offer 
        form_class = SomeModelFormWithAllFields 
    

還有更CreateXXXView使用OwnFormMixin ..

你如何保存在您的表單的用戶數據?

隱藏與保存直接在您的意見?什麼是優點/缺點?

+0

爲什麼不使用request.user進行驗證?是否有可能從另一個用戶回答POST?爲什麼甚至將與django用戶數據相關的任何相關內容暴露給窗體或任何可見部分。這是一個潛在的漏洞... – garmoncheg

回答

2

除非你允許用戶修改ForeignKeyField,沒有理由將其納入一個形式 - 我與你使用exclude保持用戶領域出你ModelForm的第一個解決方案,並設置去來自request.user的用戶。其實Django documentation now has an example along these exact lines

您的優勢在於不必防範對user_id參數的操縱,不會暴露您的內部用戶標識,也不必擔心不同的創建更新情況。一個小缺點是,如果您需要更改對象的關聯User的功能,則需要重新開始。

相關問題