【问题标题】:Filter ForeignKey in django admin panel在 django 管理面板中过滤 ForeignKey
【发布时间】:2016-12-20 19:04:02
【问题描述】:

我将从展示我的模型的外观开始:

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)

我想将所有人都放在一个表中,但在我的管理面板中我想显示两个分离的过滤列表:

  • 对于 pu 我只想显示部门缩写的人员 是'pu'
  • 对于我来说,我只想显示缩写为的人 部门是'se'

我搜索了很多,但我对 django 和 Python 很陌生。

我怎样才能实现它?

【问题讨论】:

    标签: python django


    【解决方案1】:

    django 管理员解决方法通常是可能的,但需要一些黑客攻击。

    尝试创建一个 myapp/admin.py 文件

    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
    

    【讨论】:

      【解决方案2】:

      我改变了我的模型。 我不会使用 Person 和 Department,我已经切换到 django 的 User 和 Group。

      为了根据需要过滤它,我使用了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"})
      

      我基于这个答案:Django, filter users by group in a model foreign key

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 2011-10-12
        • 2015-04-16
        • 1970-01-01
        • 2016-02-15
        • 2011-01-15
        • 2013-07-12
        相关资源
        最近更新 更多