Я всегда делал это, принимая новый 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
И затем, на мой взгляд:
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 ...
Если Review.author
не является обязательным полем, вы можете добавить второе значение к вызову kwargs.pop
, чтобы установить значение по умолчанию, например None
.В противном случае, если user
kwarg не предоставлен, он выдаст ошибку, фактически сделав ее обязательным аргументом.