Как связать две модели django в представлении

#python #django #django-models #django-views

Вопрос:

Я пытаюсь разработать приложение, в котором вводятся некоторые сведения о пациенте, алгоритм обрабатывает их и направляет на соответствующую страницу лечения

Мне удалось получить его, чтобы ввести данные о пациенте, и пользователь перенаправляется на просмотр этого экземпляра пациента, используя приведенный ниже код

Но я не уверен, как в TreatmentDetailView вместо этого представить детали соответствующего лечения, а не этот экземпляр пациента.

models.py:

 class Patient(TimeStampedModel):
    # get a unique id for each patient - could perhaps use this as slug if needed
    patient_id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)
    name = models.CharField("Patient Name", max_length=255)
    age = models.IntegerField("Age", default=0)

class Treatment(TimeStampedModel):
    name = models.CharField("Treatment Name", max_length=255)
 

views.py:

 class PatientCreateView(LoginRequiredMixin, CreateView):
    model = Patient
    fields = ['name', 'sex', 'age']

    def form_valid(self, form):
        form.instance.creator = self.request.user
        return super().form_valid(form)
    
    def get_success_url(self):
        return reverse('patient:detail',
                       kwargs={"slug": self.object.patient_id})

class TreatmentDetailView(DetailView):
    model = Patient
    slug_field = “patient_id”
    
    def find_treatment(Patient):
        treatment_instance = runalgorithm(Patient)
        return treatment_instance


 

urls.py

 urlpatterns = [
    path(
        route='add/',
        view=views.PatientCreateView.as_view(),
        name='add'),
    
    path(
        route='<slug:slug>/',
        view=views.TreatmentDetailView.as_view(),
        name='detail'),
]
 

Комментарии:

1. Чтобы уточнить, вам нужны сведения о пациенте на этой странице, а также сведения о лечении или только сведения о лечении?

2. Было бы полезно также представить некоторые сведения о пациенте на странице, но самое главное-получить подробную информацию о лечении

Ответ №1:

Я думаю, что самым простым решением было бы вместо использования подробного представления использовать представление шаблона и передать оба объекта в контекст вместе с пользовательским шаблоном.

 class TreatmentDetailView(TemplateView):
    template_name = "treatment.html"

def find_treatment(Patient):
    treatment_instance = runalgorithm(Patient)
    return treatment_instance

def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(*args, **kwargs)
    context["patient"] = get_object_or_404(
        Patient, pk=self.kwargs['patient_id']
    )
    context"treatment"] = self.find_treatment(context["patient"])
    return context
 

Комментарии:

1. Большое спасибо — это гораздо лучший способ. Было всего несколько небольших опечаток, которые вы, возможно, захотите исправить: функции «find_treatment» требуется «self» в качестве начального аргумента, или вы получаете количество ошибок в аргументах, и в предпоследней строке отсутствует» [»