24.06.2009 22:57

  1. Привет всем!

    Имею:
    
    class Sys(models.Model):
        title = models.CharField(verbose_name=u'Название игры', max_length=250, unique = True)
        
        def __unicode__(self):
            return self.title
    
    class SysValue(models.Model):
        sys = models.ForeignKey(Sys, verbose_name=u'Параметр', related_name = '%(class)s')
        value = models.CharField(verbose_name=u'Значение', max_length=250)
        
        def __unicode__(self):
            return u'%d: %s' % (self.sys.id, self.value)
    
    class Game(models.Model):
        title = models.CharField(verbose_name=u'Название игры', max_length=250, unique = True)
        system = models.ManyToManyField(Sys, verbose_name=u'Параметры', related_name = '%(class)s', through='Sys2Game')
    
        def __unicode__(self):
            return self.title
    
    class Sys2Game(models.Model):
        game = models.ForeignKey(Game)
        sys = models.ForeignKey(Sys)
        min = models.ForeignKey(SysValue, limit_choices_to = {'???': ???}, related_name='mins')
        rec = models.ForeignKey(SysValue, limit_choices_to = {'???': ???}, related_name='recs')
        
        def __unicode__(self):
            return u'%s/%s: %s|%s' % (self.game, self.sys, self.min. self.rec)
    


    Т.е. есть игры, и каждая игра описывается набором параметров (CPU, Video, Ram, etc) Каждый параметр в свою очередь имеет некоторое множество возможных значений. Например,
    Ram -> 500Mb | 1Gb | 2Gb | 8Gb
    CPU -> 1,2 Ghz | 2 Ghz | 4 Ghz
    etc

    В моделе Sys2Game для каждой игры и каждого параметра указываются минимальные и рекомендуемые требования. Набор возможных значений в полях min & rec зависит от того к какому параметру (поле sys) мы их записываем.
    Т.к. на момент заполнения данными модели Sys2Game, она еще не сохранена то и значения Sys2Game.sys (по которому можно было бы построить limit_choices_to) еще нет.

    Как быть?
  2. Может, стоит по-умолчанию делать min и rec пустыми списками, а после выбора sys подгружать соответствующие значения через XHR? Ну или визард сделать...

  3. Согласен с Алексеем, но опишу более подробно:

    Создаешь вьюшку, которая отдает в формате json набор возможных значений нужных полей (min,rec) в зависимости от какого-либо другого поля (sys). В админке переопределяешь метод formfield_for_dbfield, в нем подменяешь список значений min и rec на пустой.

    В форме на поле sys вешаешь обработчик джаваскрипт, который будет при изменении значения поля sys заполнять min и rec, например с помощью jQuery.getJSON.
  4. Алексей, Александр
    Большое спасибо! На ночь глядя, мне тоже пришло такое решение. Да, по другому никак.

    Александр
    Я еще новичок в Django. Могли бы вы чуть подробнее разъяснить о formfield_for_dbfield?
  5. http://softwaremaniacs.org/forum/django/12245/ — там есть пример

    В девелопмент версии джанги еще добавили метод formfield_for_foreignkey — http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey
  6. Alexander, спасибо!
    То что нужно )

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.