Общий вид создания и обновления Django

#django #django-models

#django #django-модели

Вопрос:

Я новичок в Django, поэтому буду признателен за любую помощь. Вот моя ситуация. У меня есть модель пациента, и у меня есть представление на основе классов для создания, обновления, удаления, сведений. Все они работают отлично. Теперь у меня есть панель мониторинга, где я отображаю сведения о пациентах в datatable (например, имя, возраст, адрес и т.д.), У меня также есть кнопка, которая должна добавлять отчет для пациента (например, лабораторные анализы — анализ мочи, анализы кала) и т.д. Я успешно создал представление создания, но я не могу создать представление обновления. Что я ищу, так это когда пользователь нажимает кнопку отчета на панели мониторинга, было бы здорово, если бы я мог отобразить представление создания, если отчет еще не был добавлен, отобразить представление обновления. Я знаю, что в обычном мире программирования я мог бы выполнить запрос к базе данных и соответствующим образом сгенерировать URL, но я не уверен, как это делается в django. введите описание изображения здесь

CreateView работает. Я не знаю, как мне написать create / update view для URL панели мониторинга.

 class Patient(models.Model):

invoice_num = models.CharField(max_length=15, unique=True)
patient_manual_id = models.IntegerField(unique=True)
name = models.CharField(max_length=100)
sex = models.CharField(max_length=1, choices=GENDER, default='M',)

class Meta:
    ordering = ['id']

def get_absolute_url(self):
    return reverse('patient_update', kwargs={'pk': self.pk})

@property
def patient_detail_link(self):
    return "<a href='"   reverse("patient_update", kwargs={"pk": self.pk}) "'>Update</a>"

@property
def patient_id_link(self):
    return "<a href='"   reverse("labreport_create", kwargs={"patient_id": self.pk}) "'>Report</a>"

def __str__(self):
    return self.id

class Clia(models.Model):

patient = models.OneToOneField(
    Patient,
    on_delete=models.CASCADE,
    primary_key=True,
)
clia_ft3            = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
clia_ft4            = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
clia_tsh            = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)

def __str__(self):
    return self.id

def get_absolute_url(self):
    return reverse('labreport_update', kwargs={'patient_id': self.pk})
  

views.py

 class CliaCreate(SuccessMessageMixin, CreateView):
model = Clia
fields = ['clia_ft3', .... 'clia_fsh', 'clia_lh', 'clia_anti_tpo', 'clia_afp', 'clia_b_hcg', 'clia_cea', ]
#success_url = reverse_lazy('labreport_create')
success_message = "Record added successfully"

def dispatch(self, request, *args, **kwargs):
    self.patient = get_object_or_404(Patient, pk=kwargs['patient_id'])
    return super().dispatch(request, *args, **kwargs)

def form_valid(self, form):
    form.instance.patient = self.patient
    return super().form_valid(form)

class CliaUpdate(SuccessMessageMixin, UpdateView):
    model = Clia
    template_name='labreports/clia_form.html'
    fields = ['clia_ft3', ..... 'clia_fsh', 'clia_lh', 'clia_anti_tpo', 'clia_afp', 'clia_b_hcg', 'clia_cea', ]
    # success_url = reverse_lazy('labreport_update')
    success_message = "Record updated successfully"
  

url.py

 urlpatterns = [
path('<int:patient_id>', views.CliaCreate.as_view(), name='labreport_create'),
path('<int:patient_id>/update', views.CliaUpdate.as_view(), name='labreport_update'),
  

]

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

1. Не могли бы вы поделиться своими моделями, пожалуйста?

2. Есть ли какая-либо связь между отчетом и пациентом?

3. ‘класс Patient (модели. Модель):’ ‘invoice_num = модели. CharField(max_length=15, unique = True)’ ‘patient_manual_id = модели. Целочисленное поле (уникальное = True)’ ‘clia класса (модели. Модель):’ ‘пациент = модели. OneToOneField(‘ ‘Пациент, on_delete=модели. КАСКАД, primary_key= True,)’

4. вместо комментариев, пожалуйста, обновите актуальный вопрос 🙂 .

5. Пожалуйста, проверьте мой обновленный ответ. надеюсь, это поможет. Спасибо

Ответ №1:

Обновленный ответ:

Добавьте новый метод в модель:

 class Patient(models.Model):
    ...
    def create_report(self):
        return reverse("labreport_create", kwargs={"patient_id": self.pk})
  

Я бы порекомендовал что-то вроде этого:

Вы можете создать отдельный UpdateView, такой же, как create view:

 class CliaUpdate(SuccessMessageMixin, UpdateView):
    model = Clia
    fields = ['clia_ft3', ...[other fields]..., 'clia_cea', ]
    #success_url = reverse_lazy('labreport_create')
    success_message = "Record updated successfully"
  

Теперь в шаблон панели мониторинга вы можете добавить следующую логику:

 {% for patient in object_list %} // rendering all patient
    # do rest of stuff for rendering dashboard
    {% if patient.clia %}
        <a href=<a href="{{ patient.clia.get_absolute_url }}">Report</a>
    {% else %}
        <a href="{{ patient.create_report }}">Report</a>
    {% endif %}

{% endfor %}
  

Объяснение:

В шаблоне я проверяю, есть ли у пациента какое-либо Clia отношение, поскольку у них есть отношение OneToOne, поэтому я могу использовать patient.clia для проверки его существования.

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

1. Я генерирую URL-адрес из model def get_absolute_url (self): return reverse(‘patient_update’, kwargs={‘pk’: self.pk })

2. Я не уверен, что это было бы уместно. Кстати, я использую: docs.djangoproject.com/en/2.1/ref/templates/builtins/#url

3. на моей панели мониторинга нет никаких шаблонов django .. просто обычный табличный html, и все передается через datatable-django-rest-framework… Я должен сделать if / else (для генерации URL-адреса создания / обновления) в моделях, я думаю… @property def patient_id_link(self): (что-то здесь)

4. TBH, мне не нравится помещать html-код в python. Я обновил ответ в соответствии с вашими комментариями, за исключением html-частей.

Ответ №2:

Добавление slug в представление сработало

 slug_field = 'patient_id'
slug_url_kwarg = 'patient_id'
  

Мне также пришлось изменить URL

 url(r'^create/(?P<patient_id>d )', views.CliaCreate.as_view(), name='labreport_create'),
url(r'^update/(?P<patient_id>d )', views.CliaUpdate.as_view(), name='labreport_update'),