Django - выбор модели из выбора другой модели, который уже выбран - PullRequest
0 голосов
/ 26 февраля 2019

Итак, у меня есть одна модель AdminChoices с полем ManytoMany, которое выбирает варианты из другой модели choices.Я хочу другую модель с полем ManytoMany, для которой выбраны только выбранные варианты AdminChoices.Вот текущий код для моделей.

class choices(models.Model):
    choices = models.CharField(max_length=300)

    def __str__(self):
        return self.choices

class AdminChoices(models.Model):
    choice1 = models.ManytoManyFields(choices, related_name="adminchoices_choice1_related")
    choice2 = models.ManytoManyFields(choices, related_name="adminchoices_choice2_related")
    etc

class UserChoices(models.Model):
    choice1 = "choice that can only be chosen from selected AdminChoices choice1"
    choice2 = "AdminChoices choice2"
    etc

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

Я не уверен, правильно ли я буду подходить, как бы я сделал эту модель?

1 Ответ

0 голосов
/ 26 февраля 2019

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

class Choice(models.Model):
    choice = models.CharField(max_length=300)

    def __str__(self):
        return self.choice

class User(models.Model):
    username=models.CharField(max_length=300)

class SlotChoice(models.Model):
    slotname=models.CharField(max_length=300)
    choice = models.ForeignKey(Choice, related_name="adminchoices_related")
    def __str__(self):
        return self.slotname + " " +self.choice.choice

class UserChoice(models.Model):
    user = models.ForeignKey(User)
    choice = models.ForeignKey(SlotChoice)

Это просто, но немного отличается от того, что вы просили.Вы можете сделать это более удобным, настроив метод " str " модели SlotChoice, как показано выше.

Однако, если вы действительно хотите сделать эту работу более похожей на оригиналВопрос немного сложнее.Чтобы действительно что-то вроде этого работало гладко, вам нужно будет использовать JavaScript: ваша форма не знает, какой слот вы выбрали при загрузке, поэтому вам нужно изменить выпадающий список при изменении выпадающего слота.Один из аккуратных способов сделать это - модуль django-smart-selects .Это просто в использовании - также для начинающих - это волшебно добавляет JS.Тогда ваши модели будут выглядеть примерно так:

 from smart_selects.db_fields import ChainedForeignKey
    class Choice(models.Model):
        choice = models.CharField(max_length=300)

        def __str__(self):
            return self.choice

class User(models.Model):
    username=models.CharField(max_length=300)

class Slot(models.Model):
    slotname=models.CharField(max_length=300)


class SlotChoice(models.Model):
    slot=models.ForeignKey(Slot)
    choices = models.ManytoManyFields(Choice, related_name="adminchoices_related")

class UserChoice(models.Model):
    user = models.ForeignKey(User)
    slot = models.ForeignKey(Slot)

    choice = = ChainedForeignKey(
    SlotChoice,
    chained_field="slot",
    chained_model_field="slot",
    show_all=False,
    auto_choose=True,
    sort=True)
...