Django通用创建和更新视图

时间:2019-03-18 06:25:04

标签: django django-models

我是Django的新手,所以我们将不胜感激。 这是我的情况。 我有一个耐心模型,并且已对基于视图的分类进行创建,更新,删除和详细信息。他们都工作得很好。现在我有了一个仪表板,在该仪表板上我可以在数据表中显示患者的详细信息(例如姓名,年龄,地址等),还有一个按钮,可以为患者添加报告(例如实验室检查,尿液检查,凳子检查)等。我成功创建了创建视图,但是无法创建更新视图。我正在寻找的是用户单击仪表板中的“报告”按钮时,如果未添加报告就可以显示创建视图,那将是很棒的,否则显示更新视图。我知道在普通的编程世界中,我可以执行数据库查询并相应地生成url,但是我不确定在django中是如何完成的。 enter image description here

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

]

2 个答案:

答案 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'),