[英]How to store current User in Django model
我正在為醫生設計的應用程序(基於django內置的User模型),可跟蹤相關患者的治療進度。 我創建了一個可以存儲基本數據(姓名,姓氏等)的“患者”模型,但是它也應該向正在治療該特定患者的醫生存儲“外鍵”。 我基本上希望每個醫生只能看自己的病人,而不能看其他醫生的病人。 這應該以登錄醫生填寫新患者數據的形式無縫完成。 盡管患者數據庫很常見,但每個醫生都應該能夠擁有另一個醫生已經使用過的患者姓名。
這是我簡化的患者模型:
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')
該表格應能夠保存名字和名字而無需顯示“ 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)。 正確的做法是什么?
通過查看其他解決方案,我最終得到了這個解決方案,該解決方案基本上可以確保將用戶傳遞給表單,並且該表單正在驗證患者對於該特定醫生是否唯一。 該模型保持不變,我更改了表單:
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))
希望對別人有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.