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