2010-07-05 9 views
2

Je le modèle suivant:Django doivent foreignkey partager une contrainte

class Program(models.Model): 
    name = models.CharField(max_length = 128) 
    def __unicode__(self): 
     return self.name 
class Cheat(models.Model): 
    program = models.ForeignKey(Program) 
    shortcut = models.CharField(max_length = 64) 
    description = models.CharField(max_length = 512) 
    def __unicode__(self): 
     return u"(%s) - %s" % (self.shortcut, self.description) 
class Category(models.Model): 
    #program = models.ForeignKey(Program) 
    name = models.CharField(max_length = 128) 
    def __unicode__(self): 
     return self.name 
class Sheet(models.Model): 
    program = models.ForeignKey(Program) 
    name = models.CharField(max_length = 128) 
    def __unicode__(self): 
     return self.name 
class CategorizedCheat(models.Model): 
    order = models.IntegerField(unique = True) 
    sheet = models.ForeignKey(Sheet) 
    cheat = models.ForeignKey(Cheat) 
    category = models.ForeignKey(Category) 
    def __unicode__(self): 
     return unicode(self.cheat) 

Dans l'administration, je veux afficher une feuille avec CategorizedCheats en ligne. Le problème est que je ne peux pas avoir que Triche qui sont liés au même programme que la feuille. Existe-t-il un moyen de filtrer ces problèmes avec le programme Sheet.program? Ou y at-il quelque chose qui ne va pas avec mes modèles?

+0

Juste pour clarifier: Cela signifie que vous êtes en train d'éditer des objets CatégorizedCheat dans un InlineAdmin qui fait partie d'un Admin for Sheet? –

+0

@lazerscience: oui – slurdge

Répondre

1

Lors du filtrage des objets disponibles dans ForeignKeys au sein de l'administration de Django, la bonne réponse est à peu près toujours ModelAdmin.formfield_for_foreignkey:

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

Les docs expliquer là-bas comment faire ce que presque exactement ce que vous cherchez . J'espère que cela pourra aider!

+0

Ouais j'ai pensé à cette fonction, malheureusement, je ne sais pas quoi mettre dans le jeu de questions, comment puis-je connaître mon propre programme? En d'autres termes, la classe MySheetAdmin (admin.ModelAdmin), comment accéder au programme Sheet.program actuel? De cela, c'est assez simple. – slurdge

0

Voici la solution finale grâce à Gabriel:.

def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "cheat": 
     kwargs["queryset"] = Cheat.objects.filter(program=Sheet.objects.get().program) 
     return db_field.formfield(**kwargs) 
    return super(CategorizedCheatAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

L'astuce était d'utiliser Sheet.objects.get() programme, ce fut l'information que je manquais.

Questions connexes