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()调用?