【问题标题】:How to store current User in Django model如何在 Django 模型中存储当前用户
【发布时间】:2014-08-15 08:12:27
【问题描述】:

我正在开发一个专为医生设计的应用程序(基于 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']

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

@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 的要求永远不会满足)。这样做的正确方法是什么?

【问题讨论】:

  • 我会敦促你重新审视你的逻辑 - 当你这样做 PatientForm(user=request.user) 然后 bbb.doctor = request.user 时,你基本上是在说医生和病人是一样的
  • 好的,那么我该如何更改,以便将当前用户在表单中添加到患者模型中?

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


【解决方案1】:

通过查看其他解决方案,我最终找到了这个解决方案,它基本上确保将用户传递给表单,并且表单正在验证患者对于该特定医生是否是唯一的。 模型保持不变,我改变了形式:

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))

希望对其他人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2020-04-30
    • 2015-08-16
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多