Django:如何通过定制Django_管理员动态筛选foreignkey选项
我有三种型号:线型、服务、域名、唱片,它们之间有m2m或外键关系。代码如下:Django:如何通过定制Django_管理员动态筛选foreignkey选项,django,django-admin,Django,Django Admin,我有三种型号:线型、服务、域名、唱片,它们之间有m2m或外键关系。代码如下: class LineType(models.Model): linename = models.CharField(max_length=30,primary_key=True) def __unicode__(self): return self.linename class Service(models.Model): servicename = models.CharF
class LineType(models.Model):
linename = models.CharField(max_length=30,primary_key=True)
def __unicode__(self):
return self.linename
class Service(models.Model):
servicename = models.CharField(max_length=30,primary_key=True)
price = models.DecimalField(max_digits=8, decimal_places=2)
line = models.ManyToManyField(LineType)
def __unicode__(self):
return self.servicename
class DomainName(models.Model):
domainname = models.CharField(max_length=30,primary_key=True)
user = models.ForeignKey(SiteProfile)
service = models.ForeignKey(Service)
def __str__(self):
return self.domainname
class Record(models.Model):
TYPE_CHOICES = (
('A','A'),
('CNAME','CNAME'),
('MX','MX'),
)
domainname = models.ForeignKey(DomainName)
def get_line(self):
domain = DomainName.objects.get(pk=self.domainname_id)
service = Service.objects.get(pk=domain.service_id)
lines = service.line.all()
choices = []
for x in lines:
choices.append((x.linename,x.linename))
return choices
host = models.CharField(max_length=30)
type = models.CharField(max_length=5,choices=TYPE_CHOICES,default='A')
line = models.ForeignKey(LineType)
destaddress = models.CharField(max_length=30)
让我介绍一下模型。每个域名只能有一个其他域名可以拥有的服务。每个域名都有多个记录。服务定义可应用于记录的线型
我使用Django admin来管理这些模型,但记录中“行”的选择都是线型对象。因此问题是如何根据其父项(域名)的“服务”筛选记录的线型。取决于您的确切要求和您的Django版本,答案可能是,或自定义ModelAdmin表单: 使用
将选择限制为
只需将行选择限制为那些匹配的linename==“foo”
class Record(models.Model):
# ...
line = models.ForeignKey(LineType, limit_choices_to={'linename': 'foo'}))
使用自定义表单
如果实例化表单时存在实例,我们可以选择它的域服务行作为queryset选项
class RecordAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(RecordAdminForm, self).__init__(*args, **kwargs)
# access object through self.instance...
if self.instance:
valid_lines = self.instance.domainname.service.line.objects.all()
self.fields['line'].queryset = valid_lines
class RecordAdmin(admin.ModelAdmin):
form = RecordAdminForm
# ...
参考问题: