Django:表单保存覆盖

时间:2011-03-23 13:17:40

标签: 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:
            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

2 个答案:

答案 0 :(得分:7)

您没有将request对象传递给instance.save()

答案 1 :(得分:2)

我认为因为你做了两件错事,

1-您希望对模型保存方法有要求

2-你在两种不同的保存方法(形式和模型)中做(或多或少)相同的事情。

现在你在表单中执行保存,然后在模型保存方法中覆盖它。

我的一般建议是放弃请求和模型保存。

最好在表单或视图级别进行这种验证/检查。恕我直言。