我一直遇到这种模式,我想知道是否有更好的方法来处理它。我的很多模特都在思考“创造者”的想法。 - 换句话说,我想确保创建对象的用户保存为创建者。因此,我的模型几乎总是包含
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中这样做?
答案 0 :(得分:3)
不,这不是正确的方法。正确的方法是从表单中排除创建者字段,然后将其设置为save:
if form.is_valid:
obj = form.save(commit=False)
obj.creator = request.user
obj.save()
... redirect ...