Как ограничить ForeignKey в Django - PullRequest
0 голосов
/ 08 марта 2012

Я использую django 1.2. У меня есть две модели.

РЕДАКТИРОВАТЬ: я только что нашел лучший пример:

class Parent(models.Model):
    name = models.CharField(max_length=255)
    favorite_child = models.ForeignKey(Child)

class Child(models.Model):
    name = models.CharField(max_length=255)
    myparent = models.ForeignKey(Parent)

в этом примере я хотел быбыть в состоянии выбрать любимого ребенка, но проблема в том, что администратор предоставит мне всех детей на выбор, а не только тех, которые являются детьми того родителя, которого я сейчас редактирую.

ОРИГИНАЛПРИМЕР:

class Version(models.Model):
    name = models.CharField(max_length = 255)
    platform = models.ForeignKey("Platform",related_name='version_platform')

class Platform(models.Model):
    name = models.CharField(max_length = 255)
    default_version = models.ForeignKey(Version,related_name='platform_default_version')

я хочу, чтобы администратор django ограничивал раскрывающийся список при выборе default_version, чтобы я мог выбирать только те версии, которые имеют текущую платформу.
, напримересли у меня есть версия с именем '1.1', которая имеет платформу joomla, и версию '1.2', в которой в качестве платформы используется wordpress.
поэтому, когда я выберу раскрывающийся список default_version в админке для wordpress, я хочу, чтобы показывал только мне версия '1.2' в выпадающем списке.теперь он показывает мне все версии.

я пытаюсь ограничить limit_choices_to, как показано здесь , поэтому я пробую это:

class Platform(models.Model):
    name = models.CharField(max_length = 255)
    default_version = models.ForeignKey(Version,limit_choices_to={'platform':XXXXX},related_name='platform_default_version')

, но я потерянчто поставить insted из XXXX я пытаюсь поставить себя, но это не сработало.
я также пытался

limit_choices_to={'platform.name':name}

я тоже не работал.

в этом примере я быхотелось бы иметь возможность выбирать любимого ребенка, но проблема в том, что администратор предоставит мне всех детей на выбор, а не только тех, которые являются детьми того родителя, которого я сейчас редактирую.

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Я нашел решение на основе Django: доступ к экземпляру модели из ModelAdmin?

добавление в admin.py Решение:

class ParentForm(ModelForm):
def __init__(self, *args, **kwargs):
    super(ParentForm, self).__init__(*args, **kwargs)
    self.fields['favorite_child'].queryset = \
    Child.objects.filter(parent=self.instance.pk)

class ParentAdmin(admin.ModelAdmin):
    form = ParentForm
2 голосов
/ 08 марта 2012

Вы можете попробовать formfield_for_foreignkey :

class PlatformAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "default_version":
            kwargs["queryset"] = Version.objects.filter(platform=self.instance.pk)
        return super(PlatformAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
0 голосов
/ 08 марта 2012

Проблема здесь перекошена. Когда вы говорите об адаптации вариантов версии в зависимости от выбранной платформы, вы говорите об AJAX. Все, что вам нужно сделать, это создать представление, которое принимает платформу в качестве аргумента и возвращает список версий в формате JSON.

Затем вы присоединяете хандер к событию onchange поля выбора платформы, который извлекает это представление через AJAX, и используете ответ JSON для создания нового набора параметров для поля выбора версии. Замените старые опции новыми и все готово.

Существует множество примеров на этом сайте и в Интернете в целом.

...