如何使 ManyToMany 字段的值显示在 Django 通用 DeleteView 中

Posted

技术标签:

【中文标题】如何使 ManyToMany 字段的值显示在 Django 通用 DeleteView 中【英文标题】:How to make ManyToMany field's value to show up in Django generic DeleteView 【发布时间】:2021-03-04 12:23:31 【问题描述】:

我一直在尝试将模型对象(正如 Django ListViews 所做的那样)与 Django 通用 DeleteView 一起发送。坦率地说,我不确定我是否能做我想做的事。下面给出的是我正在使用的,在某种程度上它正在工作:

型号

class ApsProcesses(models.Model):
    aps_process = models.CharField(primary_key=True, max_length=1, ..)
    aps_process_text = models.CharField(max_length=35, verbose_name='Process Desc')

class ProcessStatuses(models.Model):
    proc_status = models.CharField(primary_key=True, max_length=1, ...)
    proc_status_text = models.CharField(max_length=55, verbose_name='Short Desc')
    applicable_process_compo = models.ManyToManyField(ApsProcesses, related_name='proc_choices', ..)
    proc_status_weightage = models.PositiveSmallIntegerField(null=True, ..)

观看次数

class ProcStatusesDeleteView(DeleteView):
    template_name = ..
    model = ProcessStatuses
    context_object_name = 'proc_statuses'

在我的列表视图页面中,我在对象和click 上有命名的 url,它将用户带到删除页面,在该页面中显示了基础数据(对于用户选择的模型实例),然后是两个选项提供给用户 - 确认删除或取消并返回调用页面。这是我在模板中所做的:

模板

... some codes truncated here
<table>
    <tr>
        <th>Status Cd</th>
        <th>Status </th>
        <th>Process </th> 
        <th>Weightage </th>
    </tr>

<tr>
    <td style='color:red'> <strong> proc_statuses </strong></td>
    <td> proc_statuses.proc_status_text </td>
    <td> proc_statuses.applicable_process_compo__aps_process </td> # .aps_process_text # # << Tried to get field's attributes using both, not working though #
    <td> proc_statuses.proc_status_weightage </td>
</tr>
</table>
<p>Are you sure you want to delete <a style='color:red'><strong> the record?</strong></a> </p>

<input type="submit" class="btn btn-info" value="Confirm"/> 
<a href="% url 'proc_statuses_list' %" class="btn btn-info" role="button">Cancel</a>

... some codes truncated here

使用上面的模板代码显示所有字段值,除了对ManyToManyField的引用applicable_process_compo。如果我使用以下内容(即没有双下划线或带有ManyToManyField 的点):

&lt;td&gt; proc_statuses.applicable_process_compo

我在字段 aps_process 的列中收到 &lt;app_name&gt;.ApsProcesses.None。所以我知道特定模型 ApsProcesses 正在被访问,但是保存在特定模型实例中的值没有显示出来。

我的问题是:如何让 ManyToManyField 的值显示在页面中?

【问题讨论】:

【参考方案1】:

这是我为解决问题所做的:

修改模型ProcessStatuses如下图:

class ProcessStatuses(models.Model):
    proc_status = models.CharField(primary_key=True, max_length=1, ...)
    proc_status_text = models.CharField(max_length=55, verbose_name='Short Desc')
    applicable_process_compo = models.ManyToManyField(ApsProcesses, related_name='proc_choices', ..)
    proc_status_weightage = models.PositiveSmallIntegerField(null=True, ..)

    def get_processes(self):
        if self.applicable_process_compo:
            return '%s' % " / ".join([applicable_process_compo.aps_process for applicable_process_compo in self.applicable_process_compo.all()])

并且在模板中修改了用于访问 ManyToMany 字段值的行,如下所示:

<td> proc_statuses.get_processes </td>

现在我可以根据需要在页面上显示值。

【讨论】:

以上是关于如何使 ManyToMany 字段的值显示在 Django 通用 DeleteView 中的主要内容,如果未能解决你的问题,请参考以下文章

如何更新Django 的ManyToMany 字段

如何在模板上显示 Django ManyToMany?需要简单的代码

在 ManyToMany ForeignKey 字段的模板中获取值

带有额外字段的 Django ManyToMany 字段不会显示在两个关系上

ManytoMany 字段中的 Django ForeignKey 显示为 None

HTML/CSS:如何使“密码”输入显示密码?