python - Django: Limiting foreign key choices based on related object -


i'm not sure of correct terminology explain need, think easiest way example.

i have following models - company , software asset.

class company(models.model):     name = models.charfield(max_length=200)  class softwareasset(models.model):     name = models.charfield(max_length=200) 

i map various companies software assets own. example, companies may own 'microsoft office' asset, few may own 'adobe photoshop'. use join table (again, i'm not sure if correct term, or more importantly, correct way of going this).

class companyassets(models.model):     company = models.foreignkey(company)     asset = models.foreignkey(softwareasset) 

i need define employees along company employed by:

class employee(models.model):     name = models.charfield(max_length=200)     company = models.foreignkey(company) 

and finally, need define applications each employee has access to:

class employeesoftware(models.model):     employee = models.foreignkey(employee)     asset = models.foreignkey(softwareasset) 

now, works fine, 1 exception. when i'm in admin interface, , add records employeesoftware table, i'm able select softwareassets company not own. softwareasset dropdown allows me select software package defined in softwareasset table. limit assets owned company, defined in companyassets.

my preference in models - if it's possible prevent assigning employee asset company doesn't own @ database level, reading i've done not possible. i've messed around foreignkey.limit_choices_to argument didn't have luck.

i tried editing admin.py employeesoftwareadmin class using formfield_for_foreignkey:

class employeesoftwareadmin(admin.modeladmin):      def formfield_for_foreignkey(self, db_field, request, **kwargs):          if db_field.name == 'asset':            kwargs['queryset'] = companyassets.objects.filter(company__name="xxxxx") #works static       return super(employeesoftwareadmin,self).formfield_for_foreignkey(db_field,request,**kwargs) 

i have not been able find way access object within formfield_for_foreignkey method allow correct filtering happen.

give softwareasset fk company.

class softwareasset(models.model):     name = models.charfield(max_length=200)     company = models.foreignkey(company) 

so company can own many software assets. can filter software assets in custom modelform.

employeesoftwareform(forms.modelform):     class meta:         model = employeesoftware      def __init(self, *args, **kwargs):         super(employeesoftwareform, self).__init__(*args, **kwargs)         if 'instance' in kwargs:         self.fields['assets'].queryset = softwareasset.objects.filter(company = kwargs['instance'].employee.company) 

finally use custom form employeesoftware modeladmin:

class employeesoftwareadmin(admin.modeladmin):     form = employeesoftwareform 

this eliminates need companyasset model.

update: ok, want each new instance of employeesoftware know assets can have, based on employee company. because dont know employee until select it, impossible on form init. have use javascript filter select based on employee choice. (using jquery):

$("#employee").change(function(){      $.post(<your assets select url>, $("employeeform").serialize(), function (data) {     //populate returned json asset select }, 'json'); 

})

obviously, url post goes filters assets based on selected employee, should simple.


Comments

Popular posts from this blog

Java 3D LWJGL collision -

spring - SubProtocolWebSocketHandler - No handlers -

methods - python can't use function in submodule -