django表单设置当前登录用户

Ron*_*ran 4 forms django

@login_required
def post_review(request):
    if request.method == 'POST':
        formset = ReviewForm(request.POST)
        if formset.is_valid():
            formset.save(commit=False)
            #formset.author = User.objects.get(pk=int(request.user.id))
            formset.pub_date = datetime.datetime.now
            formset.save()
            return HttpResponseRedirect(reverse(review_index))
    else:
        formset = ReviewForm()
    return render_to_response("review/post_review.html",
        {"formset": formset}, context_instance=RequestContext(request),
    )
Run Code Online (Sandbox Code Playgroud)

我有这个观点,我想在我的评论表单作者字段中自动设置当前登录用户.但我不知道如何.有什么想法/提示吗?以下是我的表格:

class ReviewForm(ModelForm):
    class Meta:
        model = Review
        fields = ('title','category', 'body', )
        widgets = {
            'body': Textarea(attrs={'cols': 60, 'rows': 20}),
        }
Run Code Online (Sandbox Code Playgroud)

ete*_*ode 15

我总是通过接受我的表格中的新kwarg __init__并保存值直到保存时间来完成此操作.

class ReviewForm(ModelForm):
    class Meta:
        model = Review
        fields = ('title','category', 'body', )
        widgets = {
            'body': Textarea(attrs={'cols': 60, 'rows': 20}),
        }

    def __init__(self, *args, **kwargs):
        self._user = kwargs.pop('user')
        super(ReviewForm, self).__init__(*args, **kwargs)

    def save(self, commit=True):
        inst = super(ReviewForm, self).save(commit=False)
        inst.author = self._user
        if commit:
            inst.save()
            self.save_m2m()
        return inst
Run Code Online (Sandbox Code Playgroud)

然后在我看来:

def post_review(request):
    # ... snip ...
    if request.method == 'POST'
      form = ReviewForm(request.POST, user=request.user)
      if form.is_valid():
         form.save()
         return HttpResponseRedirect('/thanks/') #or whatever the url
      else:
         # Don't forget to add user argument
         form = ReviewForm(user=request.user)
    # ... snip ...
Run Code Online (Sandbox Code Playgroud)

如果Review.author不是必填字段,您可以向kwargs.pop调用添加第二个值以设置默认值,例如None.否则,如果user没有提供kwarg,它将引发错误,实际上使其成为必需的参数.