管理员中的Django ManyToMany

时间:2013-08-06 09:30:49

标签: django django-models django-admin

我有以下型号:

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

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

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

    我想用这种方式解决问题: 用户进入组并查看组标题。当他点击该组的名称时,他会将属于该组的设备列表作为包含所有设备字段的表格。

    如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

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

答案很长: 管理网站很棒。它功能强大,整洁,易于配置,只需几分钟。但那是关于它的。这没关系,因为它并不意味着用于高度成本化的项目。是的,有一些内置方法可以为管理网站创建costum表单而不是使用默认表单,或者以不同的方式显示它,但它仍然不是那么灵活

我看到它的方式,你有两个选择:

  1. 将管理站点文件复制到您的项目中,了解其工作原理并根据您的需求对其进行成本化

  2. 请勿使用管理网站,建立自己的观点。

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

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

    然后你有'main_admin'显示一个组列表,'admin_devices'会在一个表中显示设备及其信息列表:

    views.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包可以轻松实现管理站点允许的所有内容:列排序(数据表)或简易日期添加(jQuery UI)甚至就地编辑(jEditable),这将使它更容易您的用户