【问题标题】:Django Design Pattern - request.user in ModelDjango 设计模式 - 模型中的 request.user
【发布时间】:2014-01-13 02:37:32
【问题描述】:

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

creator = models.ForeignKey(User)

似乎没有办法将此用户默认为创建它的用户(request.user)。因此,我发现自己正在构建模型表单并将创建者添加为 HiddenInput()

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

然后用initial绑定视图中的表单

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 中进行?

【问题讨论】:

  • 如果您以任何人都可以作弊的形式包含创建者并在浏览器中更改)

标签: django


【解决方案1】:

不,这不是正确的方法。正确的方法是从表单中排除 creator 字段,然后在保存时设置:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多