2011-04-26 55 views
22

所以我有一個模型,其中包括:訪問類request.user基於通用視圖CreateView的,以設置在Django FK場

class Place(models.Model): 
    .... 
    created_by = models.ForeignKey(User) 

我的觀點是,像這樣:

class PlaceFormView(CreateView): 
    form_class = PlaceForm 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PlaceFormView, self).dispatch(*args, **kwargs) 

是有沒有辦法讓我訪問request.user並將created_by設置爲該用戶?我瀏覽過文檔,但似乎無法找到任何提示。

`

回答

22

如何重寫form_valid這確實保存形式?自己保存,做任何你想做的事,然後做重定向。

class PlaceFormView(CreateView): 
    form_class = PlaceForm 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PlaceFormView, self).dispatch(*args, **kwargs) 

    def form_valid(self, form): 
     obj = form.save(commit=False) 
     obj.created_by = self.request.user 
     obj.save()   
     return http.HttpResponseRedirect(self.get_success_url()) 
+0

謝謝!這有效,除了重定向。我得到錯誤:「沒有URL重定向到。提供一個url或在模型上定義一個get_absolute_url方法。」但是,我在模型上設置了get_absolute_url(),當我第一次獲得該視圖時(使用表單上的選擇框創建),它正確重定向。試圖找出現在。有任何想法嗎? – Brian 2011-04-26 04:32:12

+1

是的,看起來get_absolute_url被從self.object中拉出 - 所以在你的代碼中,在'form_valid'中設置'self.object = obj' – 2011-04-26 04:50:22

+0

再次感謝。得到它的工作。 – Brian 2011-04-26 05:15:54

2

一種替代的方式來做到這一點是通過在CreateView的覆蓋get_initial()方法來傳遞用戶,並修改保存方法在PlaceForm類保存用戶:

class PlaceForm(forms.ModelForm): 
    ... 
    ... 
    ... 

    def __init__(self, *args, **kwargs): 
     self.created_by = kwargs['initial']['created_by'] 
     super(PlaceForm, self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     obj = super(PlaceForm, self).save(False) 
     obj.created_by = self.created_by 
     commit and obj.save() 
     return obj 

class PlaceFormView(CreateView): 
    ... 
    ... 
    form_class = PlaceForm 

    def get_initial(self): 
     self.initial.update({ 'created_by': self.request.user }) 
     return self.initial 

這保存邏輯的方式仍然封裝在表單類中。

+0

如果用戶在數據庫中是必填字段,則不起作用 – AmiNadimi 2017-09-01 19:22:05

8

我知道這是舊的,但對於其他人有這樣的問題:

還有一個更簡單的方法 - 因爲保存形式多次將始終使用相同的模型實例,你也可以這樣做:

def form_valid(self, form): 
    obj = form.save(commit=False) 
    obj.created_by = self.request.user 
    return super(PlaceFormView, self).form_valid(form) 

通過這種方式,您可以獲得超級調用的所有優勢 - 只需添加這兩行代碼就可以輕鬆實現,而且您不必通過複製重定向邏輯來重複自己。

相關問題