2010-07-05 4 views
2

У меня есть следующие модели:Джанго Придется ForeignKey делить ограничение

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) 

В админа, я хочу, чтобы отобразить лист с CategorizedCheats рядный. Проблема в том, что я не могу иметь только Cheat, связанные с той же Программой, что и Лист. Есть ли способ фильтровать thoses с помощью Sheet.program? Или что-то не так с моими моделями?

+0

Просто чтобы уточнить: это значит, что вы редактируете объекты категории Категорически в InlineAdmin, который является частью администратора для листа? –

+0

@lazerscience: yes – slurdge

ответ

1

При фильтрации доступных объектов в ForeignKeys в админ Джанго, правильный ответ почти всегда ModelAdmin.formfield_for_foreignkey:

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

Документах там объяснить, как сделать почти то, что вы ищете , Надеюсь, это поможет!

+0

Да, я думал об этой функции, к сожалению, я не знаю, что добавить в набор запросов, как узнать свою собственную программу self.program? То есть, класс MySheetAdmin (admin.ModelAdmin), как мне получить доступ к текущей программе Sheet.program? От этого это довольно просто. – slurdge

0

Вот окончательное решение благодаря Гавриила:.

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) 

Хитрость в том, чтобы использовать Sheet.objects.get() программа, это была информация, мне не хватало.

Смежные вопросы