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

Posted

技术标签:

【中文标题】在 tableview 中引用对象 pk 时出现 pk 错误,但我仍然可以从上下文中引用对象【英文标题】:When refering to the object pk in the tableview i get a pk error but i still can refere to the object from the context 【发布时间】:2019-11-22 04:31:54 【问题描述】:

我有一个 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,
)

在视图中,我将上下文中的患者定义为可在模板中调用,它是可调用的但我不能调用患者.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 循环(在删除表单 ofc 之后)以在段落标签中显示每个患者的名字并且它有效我还尝试制作一个具有删除功能的不同模板表单并且它有效,但现在我想在按钮可调用的模式中制作删除表单。

我的模特:

# 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 顺便说一句。

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

新观点:

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】:

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

【讨论】:

以上是关于在 tableview 中引用对象 pk 时出现 pk 错误,但我仍然可以从上下文中引用对象的主要内容,如果未能解决你的问题,请参考以下文章

尝试调用 tableView.reloadData 时出现 NSInvalidArgumentException?

在 tableview 上调用 selectRowAtIndexPath 时出现 Swift 错误

从通过传递 pk 动态创建的页面注销用户时出现 ValueError

在 tableView 中修改 UITableViewCell 附件类型时出现问题:didSelectRowAtIndexPath:

将项目添加到猫鼬引用对象数组时出现问题

复制表时出现约束异常?