Каков наилучший способ динамической загрузки определенного приложения в django в зависимости от другого класса? - PullRequest
1 голос
/ 03 июня 2019

Я создал веб-приложение Django для управления медицинскими данными.У меня много специальностей, использующих один и тот же проект.Я хотел бы отобразить конкретные интерфейсы / формы / шаблоны ... в зависимости от специализации пользователя.

Я нахожусь на django 1.11 python 3.6.

Приложение работает хорошо.У меня есть пациенты и пользователи.У каждого пользователя есть только одна специальность (кардиолог, хирург ...), определенная определенным классом и связанная с пользователем ForeignKey.

models.py

class Specialite(Auditable): #list of specialites, and link it to user !

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
spe = models.CharField( max_length = 200, null = False,)
#define which app the specialite is linked to...
data_app = models.CharField(max_length = 200, null = False, blank = False)

def __str__(self):
    return self.spe 

class Patient(Auditable):

#   /3247969/modeli-django-izbegayt-dublikatov                              
class Meta:
    unique_together = ["nom", "prenom", "dob"]

MALE = "MALE"
FEMALE = "FEMALE"

SEXE = (
    (MALE, 'Homme'),
    (FEMALE, 'Femme'),
)

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
nom = models.CharField( max_length=50,)
nom_naissance = models.CharField( max_length=50,)
prenom = models.CharField(max_length=150,)
sexe = models.CharField(max_length = 100, 
                        choices = SEXE,
                        )

На данный момент,у меня есть одна таблица по пациентам: имя, фамилия, доб, вес, рост ... Только общие сведения для всех специальностей.

Я хотел бы создать конкретные таблицы на одно имя в зависимости от специальности для отображениясоответствующая информация для каждой специальности / специалиста.Каждое поле основано на классификации SNOMED CT для большей согласованности и связи данных.

Я думаю о многих способах:

  • Огромная модель сверху смного полей, с abstract = true, и подмодели, использующие эту модель
  • Огромная модель с большим количеством полей и для каждого шаблона конкретной специальности, форма для обновления данных, но данные могут изменяться, пока врачиможет быть другой анализ данных ...
  • В конце концов, я думаю, что будет более подходящим: приложение для каждой специальности со всей логикой полей, форм и т. д. внутри приложения,

Поэтому мой выбор - создание приложения для каждой специальности, связанного с моделью "специальности" внешним ключом или текстом (например, названием приложения:

data_app = models.CharField(max_length = 200, null = False, blank = False)

).

В каждом приложении у меня есть модель с просто классом, связанным с пациентом отношениями OneToOne.

class Cardiology (Auditable):

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
zkf_patient = models.OneToOneField(Patient, on_delete = models.PROTECT, null = True, blank = True)

hta = models.BooleanField()

tobacco = models.BooleanField()
.....

На данный момент я в порядке с созданиемновая запись для пациента с встроенным заводским набором форм.Тем не менее, я хотел бы отобразить соответствующий шаблон / CBV / Urls ... в зависимости от специализации пользователя для редактирования и отображения соответствующей информации.

Например, если я кардиолог:показать на главной странице вместе с «моделью пациента» подробные сведения о классе, конкретную информацию, связанную с кардиологией.Но если я хирург, показываю ту же страницу, но со специальной информацией для операции ...

Я могу сделать это сейчас, я использую {% include '... html'%} в мой шаблон, чтобы вставить то, что я хочу.

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

Но я понятия не имею, как это сделать для страницы редактирования и т. Д. .... За исключениемсоздание сценария с кучей диктовок для создания отношений, но это кажется мне кошмаром.

Как вы думаете, есть ли более элегантный способ, более «логический».Исходя из названий каждого класса, может быть ...

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 13 июня 2019

Я в итоге получил собственный тег ... Работает пока хорошо :)!

#TAGS
from django import template
from django.template.loader import render_to_string #generate a string from a template
import datetime
from django.urls import reverse

from django.template.base import (
    Node, Template, TemplateSyntaxError, TextNode, Variable, token_kwargs,
)

register = template.Library()

def get_activ_specialite(request, context):
    app_name = request.resolver_match.app_name

    if app_name == 'patient':
        #get the specialite of the user
        specialite = request.user.profile.specialite_active.spe
        specialite = '_'.join(specialite.lower().split(' '))
        return specialite


    elif app_name == 'hospitalisation':
        #get the specialite of the service where the patient is hospitalized !
        specialite = context['hospitalisation'].specialite_referente.spe
        specialite = '_'.join(specialite.lower().split(' '))
        return specialite

    return 

@register.simple_tag(takes_context=True)
def routing_antecedents(context, destination):
    if 'patient' in context:
        patient = context['patient']
        id = patient.id
    if 'hospitalisation' in context:
        hos = context['hospitalisation']
        id = hos.id
    request = context['request']

    #1/get service référent du patient
    app_name = get_activ_specialite(request, context)

    #2/ redirect to urls...! Name consistency is mandatory !!!
    url = str(app_name + ":" + destination)
    url = reverse(str(url), args=(id,) )
    # return url path ! 
    return url


@register.simple_tag(takes_context=True)
def include_antecedents_spe(context, template_name):
    request = context['request']

    #1/get service référent du patient
    app_name = get_activ_specialite(request, context)

    template_name = template_name.replace("'","").replace('"', '')
    template_name = str(str(app_name) + "/" + str(template_name))
    html = render_to_string(template_name, context.flatten())
    return html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...