Django:表单保存覆盖
我的表格:Django:表单保存覆盖,django,Django,我的表格: 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:
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方法并没有得到请求
,而是请求将其转换为我已经测试过的表单save方法。。。。Form save方法中的print语句的输出为:
request.user.id:5
已更新*
在课堂评估表(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**
我只是在modelsave方法中放了一些print语句,我发现有3个调用。对它的第一次和第二次调用包含请求,但第三次调用不包含请求。因此,前2次正确的用户id被保存,但第3次调用再次将其清除。我明白为什么会有两个呼叫,但为什么会有第三个呼叫 我做错了什么
Thx您没有将
请求
对象传递给实例.save()
我认为是因为您做了两件错误的事情
1-您希望对模型保存方法有请求
2-您使用两种不同的保存方法(表单和模型)执行(或多或少)相同的操作
现在您正在表单save中执行一些操作,然后在modelsave方法中重写它
我的一般建议是删除请求并保存模型
最好在表单或视图级别IMHO执行这种验证/检查操作。您有2个
实例.save()
&每次您不传递请求时,都会导致user=user.objects.get(pk=1)
。目前,我没有看到任何其他问题,如果有,我已经更新了我的原始帖子,以显示我在结束时所做的尝试。使用您发布的原始代码,但只需将这两个instance.save()
替换为instance.save(request=request)
我刚刚在modelsave方法中放入了一些print语句,发现有3个调用。对它的第一次和第二次调用包含请求,但第三次调用不包含请求。因此,前2次正确的用户id被保存,但第3次调用再次将其清除。我理解为什么有2个调用,但为什么有第3个调用?请检查调用AssessmentForm.save()方法的位置。是否有任何Assessment.save()调用?