我是Django的新手,所以我们将不胜感激。 这是我的情况。 我有一个耐心模型,并且已对基于视图的分类进行创建,更新,删除和详细信息。他们都工作得很好。现在我有了一个仪表板,在该仪表板上我可以在数据表中显示患者的详细信息(例如姓名,年龄,地址等),还有一个按钮,可以为患者添加报告(例如实验室检查,尿液检查,凳子检查)等。我成功创建了创建视图,但是无法创建更新视图。我正在寻找的是用户单击仪表板中的“报告”按钮时,如果未添加报告就可以显示创建视图,那将是很棒的,否则显示更新视图。我知道在普通的编程世界中,我可以执行数据库查询并相应地生成url,但是我不确定在django中是如何完成的。
CreateView正在工作。我不应该为仪表板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'),
]
答案 0 :(得分:0)
在模型中添加新方法:
class Patient(models.Model):
...
def create_report(self):
return reverse("labreport_create", kwargs={"patient_id": self.pk})
我会推荐这样的东西:
您可以创建与创建视图相同的单独UpdateView:
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 :(得分:0)
将“子弹”添加到“视图”中
slug_field = 'patient_id'
slug_url_kwarg = 'patient_id'
我还必须更改网址
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'),