如何在Django模型中存储当前用户
我正在开发一个为医生设计的应用程序(基于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))
希望这能帮助到其他人!