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

时间:2014-06-24 22:14:38

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

我正在开发一款专为医生设计的应用程序(基于django内置用户模型),该应用程序可跟踪相关患者的治疗进度。我已经创建了一个存储基本数据(姓名,姓氏等)的患者模型,但它也应该将ForeignKey存储给正在治疗该特定患者的医生。我基本上希望每个医生只能看到自己的病人,而不是其他医生的病人。这应该以登录医生填写新患者数据的形式无缝完成。虽然患者数据库很常见,但每位医生都应该能够让另一位医生使用患者的名字。

这是我简化的患者模型:

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']

这是确保当前登录的医生保存在模特的“医生”ForeignKey中的视图。

@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 :(得分: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))

希望能帮到别人!