2016-08-14 5 views
0

ich zeigen, wie mein Modell aussehen beginnen werde: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) 

ich alle Personen in einer Tabelle halten wollen, aber in meinem Admin-Panel möchte ich zwei getrennte gefilterte Listen zeigen:

  • für pu möchte ich nur Personen zeigen, welche Abkürzung der Abteilung ist ‚pu‘
  • für se will ich nur Personen zeigen, welche Abkürzung von Abteilung ‚se‘

Ich suchte viel, aber ich bin sehr neu zu Django und Python.

Wie kann ich es erreichen?

Antwort

0

django Admin-Workarounds sind in der Regel möglich, mit ein bisschen Hacking.

Versuchen

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 
0

ich mich verändert habe mein Modell ein myapp/admin.py Datei. Ich werde nicht Person und Abteilung verwenden, ich habe zu django Benutzer und Gruppe gewechselt.

Um es zu filtern, wie ich brauchte, benutzte ich 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 zu dieser Antwort basiert: Django, filter users by group in a model foreign key