简体   繁体   中英

Filter ForeignKey in django admin panel

I'll start from showing how my model look:

from django.db import models

class Project(models.Model):
    #.....
    pu = models.ForeignKey('Person', default='', related_name='pu')
    se = models.ForeignKey('Person', default='', related_name='se')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)    
    department = models.ForeignKey('Department', default='')

class Department(models.Model):
    abbreviation = models.CharField(default='', max_length=3)
    full_name = models.CharField(default='', max_length=20)

I want to keep all persons in one table but in my admin panel I want to show two separated filtered lists:

  • for pu I want to show only Persons which abbreviation of Department is 'pu'
  • for se I want to show only Persons which abbreviation of Department is 'se'

I searched a lot but I'm very new to django and Python.

How can I achieve it?

django admin work arounds are usually possible, with a bit of hacking.

Try creating a myapp/admin.py file

from django.contrib import admin
from .models import Project, Person


class ProjectAdmin(admin.ModelAdmin):
    ...
    filter_horizontal = ('pu', 'se')

    def get_form(self, request, obj=None, **kwargs):
        form = super(ProjectAdmin, self).get_form(request, obj, **kwargs)
        if obj:
            form.base_fields['pu'].queryset = Person.objects.filter(department__abbreviation__startswith='pu')
            form.base_fields['se'].queryset = Person.objects.filter(department__abbreviation__startswith='se')
        return form


admin.site.register(Project, ProjectAdmin)  # register it

I've changed my model. I won't use Person and Department, I've switched to django's User and Group.

To filter it as I needed i used limit_choices_to .

pu = models.ForeignKey("auth.User", related_name='pu', limit_choices_to={'groups__name': "Purchasing"})
se = models.ForeignKey("auth.User", related_name='se', limit_choices_to={'groups__name': "Sales"})

I based on this answer: Django, filter users by group in a model foreign key

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM