0

我有以下型号:

class Device(models.Model):
    device_name = models.CharField(max_length=50L, blank=True)
    hostname = models.CharField(max_length=255L, blank=True)
    ip = models.CharField(max_length=255L, blank=True)
    vendor = models.CharField(max_length=255L, blank=True)
    model = models.CharField(max_length=255L, blank=True)
    town = models.CharField(max_length=255L, blank=True)
    ...
class Group(models.Model):
    device = models.ManyToManyField(Device)
    group_name = models.CharField(max_length=255L, blank=True, unique=True)

设备表包含超过 30000 条记录,一个组可以容纳 5000、10000 甚至更多的设备。

我需要:

  1. 将设备添加到组;
  2. 查看组的内容;
  3. 编辑整个组(删除设备)。

标准工具(filter_horizontal、内联、raw_id_fields)不合适。因为表单编辑Group工作非常缓慢,因为它检索所有设备记录。要选择所需的设备,需要更多信息(型号、制造商、位置等)。要从组中删除所需的设备,我必须滚动 30000 个设备的列表或滚动组中的 7000 个设备并使用 CTRL 键将其删除。这种方式不适用。

将设备添加到组的问题我通过向设备添加自定义操作来解决(使用list_filter并且search_fields我得到正确的结果,然后操作“添加到组”)

剩下的问题我还没有找到。

我想这样解决问题:用户进入组并看到组标题。当他单击组的名称时,他会获得属于该组的设备列表,作为包含所有设备字段的表格。

如何做到这一点?

4

1 回答 1

1

简短的回答:不要使用管理站点。

长答案:管理网站很棒。它功能强大、简洁且易于在几分钟内完成配置。但仅此而已。这很好,因为它不适合用于高度定制的项目。是的,有一些内置的方法可以为管理站点创建服装表单,而不是默认使用,或者以不同的方式显示它,但它仍然不是那么灵活

在我看来,你有两个选择:

  1. 将管理站点文件复制到您的项目中,了解它的工作原理并根据您的需要进行定制

  2. 不要使用管理站点,建立自己的视图。

现在您可能似乎喜欢第一个想法,但根据我的经验,第二个总是更容易。尽管使用管理站点很诱人,但自己构建类似的东西并不复杂。这是对它的外观的一般解释:

url('^myadmin/$', 'myapp.views.main_admin'),
url('^myadmin/(?P<group_pk>\d+)/$', 'myapp.views.admin_devices')

然后你让'main_admin'显示组列表,'admin_devices'将在表中显示设备列表及其信息:

视图.py

def admin_devices(request, group_pk)
    group = Group.objects.get(group_pk)
    devices = group.device.all()

    return render_to_response('devices.html', {'devices': devices})

模板

<table>
<tr>
    <th>device name</th>
    <th>host name</th>
    <th>ip</th>
    ... and so on...
<tr>
{% for device in devices %}
    <tr>
        <td>{{ device.device_name }}</td>
        <td>{{ device.host_name }}</td>
        <td>{{ device.ip }}</td>
                    .... and so on...
    </tr>
{% endfor %}
</table>

它看起来比管理站点的默认外观要好得多,因为您可以为每个组提供一些图像或为组的所有链接提供一个漂亮的 UI,当您看到设备时,您可以避免加载所有 30K 设备,并添加分页和一些主题。周围有很多 jQuery 包可以轻松实现管理站点允许的所有功能:列排序 (Datatables) 或简单的日期添加 (jQuery UI),甚至就地编辑 (jEditable),这将使其更容易你的用户

于 2013-08-06T12:21:41.020 回答