Как сохранить текущего пользователя в модели Django

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

Надеюсь, это поможет другим!