#python #django #django-models #django-forms #django-views
#python #django #django-модели #django-формы #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']
И вот представление, которое гарантирует, что текущий вошедший в систему врач сохраняется во внешнем ключе модели 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. Я бы настоятельно рекомендовал вам пересмотреть свою логику — когда вы это делаете
PatientForm(user=request.user)
, и тогдаbbb.doctor = request.user
вы, по сути, говорите, что врач и пациент одинаковы2. Хорошо, итак, как мне изменить это так, чтобы текущий пользователь добавлялся в форме к модели пациента?
Ответ №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))
Надеюсь, это поможет другим!