Набор запросов поля Django ModelForm на основе другого поля - PullRequest
0 голосов
/ 05 ноября 2019

Рассмотрим мои models.py,

PowerPolicy :

class PowerPolicy(models.Model):
    name = models.CharField(max_length=15)
    ...

Группа :

class Group(models.Model):
   name = models.CharField(max_length=15)
   #But then, we also have:
   power_policies = models.ManytoManyField(PowerPolicy)


Player :

class Player(models.Model):
    name = models.CharField(max_length=15)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    ...

А потом еще одна модель под названием,
UsePower :

class UserPower(models.Model):
    player = models.ForeignKey(Player, on_delete=models.CASCADE)
    power_policy = models.ForeignKey(PowerPolicy, on_delete=models.CASCADE)
    ...

Но! Вот подвох: я хочу сделать так, чтобы мой суперпользователь (обратите внимание, что мой суперпользователь не игрок, он просто суперпользователь) может создать только UsePower объект Power, указанный в Player 'Group. Теперь я знаю, что мне нужно создать собственную форму и переопределить набор запросов в поле power_policy, которое возвращает мой пользовательский набор запросов в соответствии с моими потребностями через функцию.
- Вот как это будет выглядеть:

class UsePowerForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(UsePowerForm, self).__init__(*args, **kwargs)

        def MyCustomFunctionThatReturnsTheQuerySet():
            This function returns the Power policies that are allowed to the player in
            their player Group. The only problem is,
            Our little function here doesn't know how to get the player chosen.
                could you help
            return TheQuerySet

        self.fields['power_policy'].queryset = MyCustomFunctionThatReturnsTheQuerySet()

А затем используйте его на сайте администратора, выполнив следующее:

class UsePowerAdmin(admin.ModelAdmin):
    form = UsePowerForm

admin.site.register(UsePower, UsePowerForm)

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

Спасибо за ваше время, прочитав это, я искренне ценю это.

РЕДАКТИРОВАТЬ: Использование очистки формы или проверки во время сохранения, не вариант для меня: (

1 Ответ

0 голосов
/ 05 ноября 2019

Вы можете получить игрока при инициализации формы:

class UserPowerForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(UsePowerForm, self).__init__(*args, **kwargs)

        player = Player.objects.get(id=self.initial['player'])

        ###from here you can use player to get the power policies and put into list

        self.fields['power_policy'] = forms.ChoiceField(choices=power_policy_list)


    class Meta:
        model = UserPower
        fields = ['player', 'power_policy']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...