Как изменить/отфильтровать список опций в поле TreeNodeChoiceField в TabularInline
Как изменить список опций/выборов поля conto
, основываясь на значении gruppo_id
?
conto
- это внешний ключ к ветви дерева, описываемого как model.ContoCOGE(MPTTModel)
.
Для каждого gruppo
существует дерево, которое развивается на определенную глубину.
Как отфильтровать все деревья и в поле TreeNodeChoiceField в TablularInline
перечислить только те, которые имеют group_id?
В отладке переопределенная formfield_for_foreignkey(self, db_field, request, **kwargs) возвращает правильное дерево. Но браузер отображает страницу с полем выбора со всеми деревьями.
#model.py
from mptt.models import MPTTModel, TreeForeignKey
from multigroup.models import Gruppo
class ContoCOGE (MPTTModel):
gruppo = models.ForeignKey(Gruppo, on_delete=models.CASCADE,related_name='contoCOCGE_gruppo')
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
class PncGen (models.Model):
gruppo = models.ForeignKey(Gruppo, on_delete=models.CASCADE)
#other stuff
class PncRighe (models.Model):
gruppo = models.ForeignKey(Gruppo, on_delete=models.CASCADE)
idPnc = models.ForeignKey(PncGen,on_delete=models.CASCADE) #puntatore alla testata
conto = models.ForeignKey(ContoCOGE,on_delete=models.CASCADE,blank=True, null=True)
#other stuff
#admin.py
from django_mptt_admin.admin import DjangoMpttAdmin
class PncRigheInline(admin.TabularInline):
model = PncRighe
autocomplete_fields = ['partitarioRiga','conto']
extra = 1
def filter_tree_queryset(self, queryset,request):
qs = queryset.filter(gruppo_id=int(request.session['gruppo_utente']))
return qs
def get_changeform_initial_data(self, request):
return {'gruppo': int(request.session['gruppo_utente'])}
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'gruppo' or db_field.name == 'idRiga' or db_field.name == 'idPnc':
kwargs['widget'] = forms.HiddenInput()
if db_field.name == 'conto':
db = kwargs.get("using")
qs = self.get_field_queryset(db, db_field, request)
kwargs['queryset']=qs.filter(gruppo_id = request.session['gruppo_utente'] )
@admin.register(PncGen)
class PncGenAdmin(admin.ModelAdmin):
#...
inlines = (PncRigheInline,)
Я нашел квази-решение. Оно работает, но без функции автозаполнения. Я могу изменить набор запросов поля ForeignKeyField с помощью formfield_for_foreignkey, но объединение с автозаполнением не работает.
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'gruppo' or db_field.name == 'idRiga' or db_field.name == 'idPnc':
kwargs['widget'] = forms.HiddenInput()
if db_field.name == 'conto':
db = kwargs.get("using")
qs = self.get_field_queryset(db, db_field, request)
db_field.choices = [ ( p.id, '{0}'.format( str(p)),) for p in qs.filter(gruppo_id = request.session['gruppo_utente']).exclude(parent=None) ]
return super(PncRigheInline,self).formfield_for_foreignkey(db_field, request, **kwargs)