From 2a0744f6020688373273788c6c6be27c15f29967 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Wed, 6 Jan 2016 22:39:32 +0100 Subject: [PATCH] Override form in InterfaceInline to get to expensive lookup --- mdb/admin.py | 3 ++- mdb/forms.py | 22 ++++++++++++++++++++++ mdb/models.py | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 mdb/forms.py diff --git a/mdb/admin.py b/mdb/admin.py index 3c7694c..3fc9f44 100644 --- a/mdb/admin.py +++ b/mdb/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin, messages - +from mdb.forms import InterfaceForm from mdb.models import Ip6Address, Interface, Ip4Address, DhcpOption, DhcpCustomField, DomainSrvRecord, DomainTxtRecord, \ DomainCnameRecord, DomainARecord, Domain, Host, Ip4Subnet, Ip6Subnet, Nameserver, MailExchange, OperatingSystem, \ HostType, DhcpConfig, DomainAAAARecord @@ -14,6 +14,7 @@ class InterfaceInline(admin.TabularInline): inlines = [Ip6AddressInline] model = Interface extra = 0 + form = InterfaceForm def get_queryset(self, request): return super(InterfaceInline, self).get_queryset(request).select_related() diff --git a/mdb/forms.py b/mdb/forms.py new file mode 100644 index 0000000..51dfd6f --- /dev/null +++ b/mdb/forms.py @@ -0,0 +1,22 @@ +from django import forms +from django.forms import ModelChoiceField + +from mdb.models import Interface, Ip4Address + + +class Ipv4ModelChoiceField(ModelChoiceField): + # def __init__(self, *args, **kwargs): + # super(Ipv4ModelChoiceField, self).__init__(*args, **kwargs) + + def label_from_instance(self, obj): + # TODO improve those labelZ + return obj.__str__() + + +class InterfaceForm(forms.ModelForm): + model = Interface + + def __init__(self, *args, **kwargs): + super(InterfaceForm, self).__init__(*args, **kwargs) + + self.fields['ip4address'] = Ipv4ModelChoiceField(queryset=Ip4Address.objects.select_related()) diff --git a/mdb/models.py b/mdb/models.py index eb3f3f1..f83aee9 100644 --- a/mdb/models.py +++ b/mdb/models.py @@ -476,6 +476,7 @@ class Ip4Address(models.Model): if not hasattr(self, 'interface'): return self.address + # FIXME: Remove this when admin is overridden return "{} ({})".format(self.address, self.interface.host.hostname) def assigned_to_host(self):