如何在Django模型中存储当前用户

1 投票
1 回答
1466 浏览
提问于 2025-04-18 10:57

我正在开发一个为医生设计的应用程序(基于Django内置的用户模型),这个应用可以跟踪相关患者的治疗进展。我创建了一个患者模型,用来存储基本信息(比如名字、姓氏等),但它还需要存储一个外键,指向正在治疗这个患者的医生。我希望每位医生只能看到自己的患者,而看不到其他医生的患者。这应该在一个表单中无缝完成,已登录的医生填写新患者的数据。尽管患者数据库是共享的,但每位医生可以使用与其他医生相同的患者名字。

这是我简化后的患者模型:

class Patient(models.Model):
     first_name = models.CharField()
     second_name = models.CharField()
     doctor = models.ForeignKey(User,default="", blank=True, null=True)

     class Meta:
         unique_together=('first_name','second_name','doctor')

这个表单应该能让医生保存名字和姓氏,但不显示“医生”这个字段,因为这个字段应该自动添加,以匹配当前登录的用户。

class PatientForm(models.Model):
     first_name=forms.CharField(widget=TextInput())
     last_name=forms.CharField(widget=TextInput())

def __init__(self,user,*args, **kwargs):
    super(PatientForm,self).__init__(*args,**kwargs)
    self.user = user

     class Meta:
          model=Patient
          exclude = ['doctor']

这里是一个视图,确保当前登录的医生被保存到模型的“医生”外键中。

@login_required
def patient_new(request):
    if request.method == 'POST':
        form = PatientForm(user=request.user,data=request.POST)
        if form.is_valid():
            bbb=form.save(commit=False)
            bbb.doctor = request.user
            bbb.save()
            return HttpResponseRedirect(reverse('patient'))
        else: 
           print form.errors
    else:
            form = PacjentForm(user=request.user)
return render_to_response('patient_new.html',{'form':form}, context_instance=RequestContext(request))

不过,问题是这个解决方案不允许不同的医生使用相同的患者名字(基本上,要求的unique_together从未满足)。那该怎么做才对呢?

1 个回答

0

通过查看其他的解决方案,我最终找到了这个方法。这个方法主要是确保用户信息能够传递到表单中,并且表单会检查这个病人是否是这个特定医生的唯一病人。

模型部分没有做任何修改,我只是改动了表单:

class PatientForm(forms.modelForm):
    first_name=forms.CharField(widget=TextInput())
    last_name=forms.CharField(widget=TextInput())

    def __init__(self,user,*args, **kwargs):
         self.request = kwargs.pop('request')            
         return super(PatientForm,self).__init__(*args,**kwargs)

    def clean(self):
         cleaned_data=self.cleaned_data
         try:
             Patient.objects.get(first_name=cleaned_data['first_name'], last_name=cleaned_data['last_name'],doctor=self.request.user)
         except Patient.DoesNotExist:
             pass
         else:
             raise ValidationError('A Patient with this name already exists')

    def save(self,*args, **kwargs):
         kwargs['commit']=False
         obj = super(PatientForm.self).save(*args,**kwargs)
         if self.request:
               obj.doctor = self.request.user
         obj.save()

    class Meta:
        model=Patient
        exclude = ['doctor']

还有 view.py 的修改:

@login_required
def patient_new(request):
    if request.method == 'POST':
        form = PatientForm(request.POST,request=request)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('patient'))
        else: 
            print form.errors
     else:
        form = PacjentForm(request=request)
return render_to_response('patient_new.html',{'form':form}, context_instance=RequestContext(request))

希望这能帮助到其他人!

撰写回答