簡體   English   中英

在Django管理面板中過濾ForeignKey

[英]Filter ForeignKey in django admin panel

我將從顯示模型的外觀開始:

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,我只想顯示Department的縮寫為'pu'的人員
  • 就我而言,我只想向人顯示Department的縮寫為“ se”

我進行了很多搜索,但是對django和Python還是陌生的。

我該如何實現?

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

我改變了我的模特。 我將不使用“人員”和“部門”,而是切換到django的“用戶”和“組”。

為了根據需要過濾它,我使用了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,在模型外鍵中按組過濾用戶

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM