2014-01-12 50 views
1

我總是碰到這種模式,我想知道是否有更好的方法來處理它。我的很多模型都考慮到'創造者'的概念 - 換句話說,我想確保創建該對象的用戶被保存爲創建者。因此,我的模型幾乎總是包括Django Design Pattern - request.user in Model

creator = models.ForeignKey(User) 

似乎有不被拖欠該用戶誰創造了它的用戶(request.user)的一種方式。因此,我發現自己建立的模型形式並添加創建者爲HiddenInput()

class MyModelForm(ModelForm): 
    class Meta: 
     model = MyModelForm 
     fields = ['name', 'creator'] 
     widgets = { 
      'creator': HiddenInput() 
     }   

,然後用初始

form = MyModelForm(initial={'creator': request.user}) 

結合的形式,在視圖中,檢查開機自檢,以確保沒有一個人討價還價與形式(全視圖):

def create(request): 
    form = MyModelForm(initial={'creator': request.user}) 
    if request.method == 'POST': 
     if int(request.POST['creator']) != int(request.user.id): 
      return render(request,'500.html', {'message':'form tampering detected'}) 
     form = FeedGroupForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse('index')) 
    return render(request, 'mymodelformpage.html',{'form':form}) 

我很好,但它看起來像一個反模式。這讓我覺得應該有一種方法來默認模型中的創建者。

creator = models.ForeignKey(User, default=request.user) 

或者在post_save中執行它?

+0

如果包括在形式的創造者,任何人都可以欺騙,並在瀏覽器中改變這一點) – Pol

回答

3

不,這不是正確的方法。正確的方法是從形式排除創作者字段,然後將其放置在節省:

if form.is_valid: 
    obj = form.save(commit=False) 
    obj.creator = request.user 
    obj.save() 
    ... redirect ...