我的表格:
class AssessmentForm(ModelForm):
def save(self, commit=True, request=None, *args, **kwargs):
print 'request.user.id:',request.user.id
instance = super(AssessmentForm, self).save(commit=False)
if commit:
instance.save(request=request)
if request:
instance.modifier = request.user
instance.save(request=request)
return instance
class Meta:
model = Assessment
我的模特课
class Assessment(models.Model):
name = models.CharField(max_length=255, verbose_name="Title")
review_state = models.CharField(max_length=20,
choices=REVIEW_STATE_CHOICES)
iteration = models.IntegerField(choices=ITERATION_CHOICES)
assessment_note = models.TextField(verbose_name="Notes",
blank=True,
null=True)
.... snip ....
modifier = models.ForeignKey(User,
editable=False,
related_name="%(app_label)s_%(class)s_modifier_related")
modified = models.DateField(editable=False)
def save(self, request=None, *args, **kwargs):
if request:
user = request.user
else:
user = User.objects.get(pk=1)
self.modifier = user
self.modified = datetime.now()
if not self.id:
self.creator = user
self.created = datetime.now()
super(Assessment, self).save(*args, **kwargs)
当我保存表单时,modified
字段在数据库中具有id 1而不是id 5,这是用户表中当前用户的id。因此,模型上的save方法没有得到request
,但是请求正在进行我已经测试的Form保存方法.... Form保存方法中print语句的输出是:
request.user.id: 5
更新*
在class AssessmentForm(ModelForm)
我也尝试过:
def save(self, commit=True, request=None, *args, **kwargs):
print 'request.user.id:',request.user.id
instance = super(AssessmentForm, self).save(commit=False)
if commit:
instance.save(request=request)
return instance
已更新2 ** 我只是在模型保存方法中放了一些打印语句,我发现有3个调用它。对它的第一次和第二次调用包含请求,但第三次调用没有。因此保存正确用户ID的前2次,但第3次呼叫再次擦除它。我理解为什么有2个电话,但为什么有第3个电话?
我在这里做错了什么?
THX
答案 0 :(得分:7)
您没有将request
对象传递给instance.save()
答案 1 :(得分:2)
我认为因为你做了两件错事,
1-您希望对模型保存方法有要求
2-你在两种不同的保存方法(形式和模型)中做(或多或少)相同的事情。
现在你在表单中执行保存,然后在模型保存方法中覆盖它。
我的一般建议是放弃请求和模型保存。
最好在表单或视图级别进行这种验证/检查。恕我直言。