Django设计模式 - 模型中的request.user

时间:2014-01-12 17:57:58

标签: django

我一直遇到这种模式,我想知道是否有更好的方法来处理它。我的很多模特都在思考“创造者”的想法。 - 换句话说,我想确保创建对象的用户保存为创建者。因此,我的模型几乎总是包含

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})

并检查POST以确保没有人对表单(完整视图)进行诋毁:

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中这样做?

1 个答案:

答案 0 :(得分:3)

不,这不是正确的方法。正确的方法是从表单中排除创建者字段,然后将其设置为save:

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