在tableview中引用对象pk时,出现pk错误,但我仍然可以从上下文引用对象

时间:2019-07-12 11:49:31

标签: django django-rest-framework django-templates django-views django-tables2

我有一个Django应用,我想在其中显示用户条目表,用户可以通过按钮从表中删除/编辑条目。我使用django-tables2作为呈现表的库。

Tables.py

class PatientTable(tables.Table):

FirstName = tables.Column(linkify=("patients:patient_detail", {"pk": tables.A("pk")}))
LastName = tables.Column(linkify=("patients:patient_detail", {"pk": tables.A("pk")}))
Telephone_no = tables.Column(linkify=("patients:patient_detail", {"pk": tables.A("pk")}))

delete = TemplateColumn('<button type ="button" class ="btn btn-danger" data-toggle="modal" data-target="#modalDelete" >Deleta</button>',extra_context={'patient': 'Patient'})

class Meta:
    model = Patient
    attrs = {'class': 'table table-striped table-hover'}
    exclude = ("user", "Notes", "Adress")
    template_name = 'django_tables2/bootstrap4.html'

Views.py

def Patients_list(request):

patients = Patient.objects.all()
table = PatientTable(patients.filter(user=request.user))
RequestConfig(request).configure(table)

return render(request, 'patients/patients_list.html',{
'table' : table,
'patients':patients,
})

在视图中,我在上下文中将患者定义为可以在模板中调用,可以调用,但是我不能调用Patient.pk,它总是返回值错误。

模板

 {% extends 'base.html' %}
{% load render_table from django_tables2 %}

{% block content %}

<div id="content">

    {% if user.is_authenticated %}

    <h1> Patients list: </h1>
    <br>

    <a href="{%url 'patients:patient_create'%}" class="btn btn-info" role="button">Add Patient</a>
    <br>
    <br>

    {% render_table table %}

    {% else %}

      <h2>please login</h2>

    {% endif %}

</div>

 <div class="modal fade" id="modalDelete" tabindex="-1" role="dialog" aria-labelledby="modalDelete"
  aria-hidden="true">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Delete patient!</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        <p>Are you sure you want to delete this patient?</p>
      </div>
      <div class="modal-footer">
           <form method="POST" action="{% url 'patients:patient_delete' pk=patients.pk %}">
                            {% csrf_token %}
        <input class="btn btn-danger" value="Yes" type="submit" >
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                       </form>
      </div>
    </div>
  </div>
</div>

  {% endblock %}

在此模板中,我收到此错误:

Reverse for 'patient_delete' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['patients/delete/(?P<pk>[0-9]+)$']

我尝试了

Patients.pk
pk

但是它不起作用,在模板中,我尝试制作一个for循环(删除c的形式后)以显示每个患者的名字在段落标签中,并且它也起作用,我还尝试制作一个用于删除的其他模板表单,它可以正常工作,但现在我想使删除表单成为可通过按钮调用的模式。

我的模特:

# Patient model each patient is uniquely identified by his doctor/user
class Patient(models.Model):
    FirstName = models.CharField(max_length=264)
    LastName = models.CharField(max_length=264)
    Adress = models.TextField(blank=True, null=True)
    Telephone_no = PhoneNumberField(blank=True, null=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='patients')
    birth_date = models.DateField()
    # Age = models.CharField(max_length=100,blank = True ,null = True)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
    Notes = models.TextField(blank=True, null=True)

def __str__(self):
    return str(self.FirstName) + " " + str(self.LastName)

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

还有一个与此相关的模型,其中一个患者字段为ForiegnKey btw。

我尝试将用户的视图更改为推荐的视图,但这是相同的问题

新视图:

def Patients_list(request):

patients = Patient.objects.filter(user=request.user)
table = PatientTable(patients)
RequestConfig(request).configure(table)

return render(request, 'patients/patients_list.html',{
'table' : table,
'patients':patients,
})

建议是我无法从Patient.objects.all()获取pk,因此我需要将它更改为带有get的形式,但是get没有起作用,所以我使用了过滤器。

我认为如果将其更改为CBV,它应该可以工作,但我真的不知道如何像定义普通CBV那样定义查询集来制作查询集。

我已经在这个问题上停留了10天,现在在许多论坛/站点上进行了询问,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

实现我想要的唯一方法是通过进行for循环并遍历所有对象在模板中手动呈现表。