如何不显示created_by字段,而是使用保持unique_together规则的当前用户自动填充它?

时间:2015-01-17 19:49:40

标签: django django-models django-forms django-views

我的模型假设每个用户(假设它是医生)可以拥有自己的患者。因此,Patient模型具有当前登录用户的'created_by'字段。每个医生(即,用户)应该只有一个具有相同的第一和第二名称的患者(例如John Smith),但是不同的医生(即其他用户)可以再次患有例如患者。约翰·史密斯。因此,我标记了三个字段:first_name,last_name,created_by为unique_together。

class Patient(models.Model):
     first_name = models.CharField(max_length = 30)
     last_name = models.CharField(max_length = 30)
     created_by = models.ForeignKey(User, blank=True)

    class Meta:
         unique_together = (("created_by","first_name", "last_name"),)

我想要实现的是'created_by'字段不应出现在表单中,但应自动填充。这是ModelForm:

class PatientForm(ModelForm):

    class Meta:
        model=Patient
        fields = '__all__'

    def save(self,request):
        obj = super(PatientForm, self).save(commit = False)
        obj.created_by = request.user
        obj.save()

    def clean(self):
        cleaned_data = super(PatientForm, self).clean()

        first_name = cleaned_data.get('first_name')
        last_name = cleaned_data.get('last_name')
        created_by = cleaned_data.get('created_by')

        if Patient.objects.filter(first_name = first_name, last_name = last_name, created_by = created_by).exists():
            raise ValidationError('This name already exists!')
        else:
            return cleaned_data

问题在于:正如您所见,ModelForm包含'created_by'字段。如果我使用ModelForm将其排除,则unique_together验证将不起作用。如果我没有在模板中显示“created_by”字段,那么在form.is_valid()验证步骤中它将在视图中失败。

如何不显示created_by字段,而是使用保留unique_together规则的当前用户自动填充它?

1 个答案:

答案 0 :(得分:1)

Django已经为你的模型validates the uniqueness了,没有必要自己做。诀窍是确保在模型验证之前设置created_by字段,即如果您正在创建新患者:

p = Patient(created_by=request.user)
form = PatientForm(data=request.POST or None, instance=p)

没有必要将created_by字段添加到表单中 - 除非当前用户只是默认值,并且医生可以将另一位医生的病人添加到系统中。在这两种情况下,Django都会检查您的Patient是否遵循unique_together约束。