2017-05-29 3 views
0

Das Problem

Ich habe zwei viele zu viele Felder (disciplines, subjects) in Excerpt Modell zeigt, und ich möchte in Admin-Seite zeigen, nur die subjects innerhalb disciplines die corresponde.Filter ein ManyToManyField in django Admin-Seite

Beispiel

DISCIPLINE | SUBJECT 
portugues | article 
portugues | verbs 
portugues | nons 
math  | numbers 
math  | equations 

DISCIPLINE = math 

DISCIPLINE | SUBJECT 
math  | numbers 
math  | equations 

Wie ich

Dafür verwende ich die Funktion formfield_for_manytomany innerhalb Admin teilweise gelöst, es die Objekte zum Filtern, gut funktioniert, aber ich kann nicht herausfinden, wie zu filtern die subject Objekte auf dem choosed discipline basiert,

Was habe ich versucht,

ich versucht, einen Funkt Ion in model.py get_disciplines für die Rückgabe der entsprechenden ID, für dann die Themen zu filtern, aber dieser Ansatz scheint nicht in meinem Admin-Proxy-Modell zu funktionieren, weil ein Fehler global name 'get_disciplines' is not defined wahrscheinlich cuz ich kann außerhalb von model.py zugreifen. Ich versuchte auch, diese Methode in Admin-Proxy zu deklarieren, aber funktioniert auch nicht.

meinen Code

# model.py 
class Discipline(models.Model): 
    id = models.CharField(max_length=15, primary_key=True) 
    name = models.CharField(max_length=100) 

class Subject(models.Model): 
    id = models.CharField(max_length=15, primary_key=True) 
    name = models.CharField(max_length=100) 
    disciplines = models.ManyToManyField(Discipline) 

class Excerpt(models.Model): 
    discipline = models.ManyToManyField(Discipline) 
    subjects = models.ManyToManyField(Subject) 

    # my idea 
    def get_disciplines(self): 
     e = self.discipline.first() 
     return e.id 

# admin.py 
class ExcerptTaggerAdmin(ImageCroppingMixin, admin.ModelAdmin): 
    filter_horizontal = ('subjects','discipline') 

    def formfield_for_manytomany(self, db_field, request, **kwargs): 
     if db_field.name == "subjects": 
      kwargs["queryset"] = Subject.objects.filter(disciplines = get_discipline) 
     return super(ExcerptTaggerAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) 

class ExcerptTagger(Excerpt): 
    class Meta: 
     proxy = True 

Ich bin kein Profi in django, so denke ich, kann für jemand einfach sein, die mehr Erfahrung, ich hoffe, dass Sie mir helfen können

Antwort

0

ich eine Lösung gefunden, aber es ist nicht so schön, aber seine Arbeit

def formfield_for_manytomany(self, db_field, request, **kwargs): 
    if db_field.name == "subjects": 
     self_pub_id = request.resolver_match.args[0] 

     d = Excerpt.objects.get(id=self_pub_id).discipline.first() 

     kwargs["queryset"] = Subject.objects.filter(disciplines=d) 

    return super(ExcerptTaggerAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) 

Wenn jemand eine bessere Lösung hat, würde ich schätzen

Verwandte Themen