如何更改/过滤 TabularInline 中 TreeNodeChoiceField 中的选项列表

问题描述 投票:0回答:1

如何根据值

conto
更改
gruppo_id
字段的选项/选择列表?

conto
是描述为
model.ContoCOGE(MPTTModel)
的树分支的外键。 对于每个
gruppo
都有一棵树,它发展到一定的深度。 如何在所有树中进行过滤,并在
TablularInline
的 TreeNodeChoiceField 中仅列出具有 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,)
python django django-mptt
1个回答
0
投票

我找到了一个准解决方案。它可以工作,但没有自动完成功能。

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)
© www.soinside.com 2019 - 2024. All rights reserved.