Django forms.ModelChoiceField проблема набора запросов с models.manager - PullRequest
1 голос
/ 20 апреля 2020

У меня проблемы с созданием набора запросов ModelChoiceField в ModelForm. Связанный менеджер model.objects был переопределен, чтобы отфильтровать результаты, чтобы получить только экземпляры, созданные фактическим пользователем. Вот мои модели:

class Bloc(ModelPrive):
    TYPE_BLOC = (
        ('pleinchamps', 'plein champs'),
        ('tunnel', 'tunnel'),
        ('pepiniere', 'pépinière'),
        ('autre', 'autre'),
    )
    nb_planche = models.IntegerField(null=True)
    caracteristique = models.CharField(max_length=200, null= True, blank=True)
    geom = models.PolygonField(srid=4326)
    type_bloc = models.CharField(max_length=200, blank=True, choices=TYPE_BLOC)
    nom = models.CharField(max_length=200, null=True, unique= True)


class ModelPrive(models.Model):
    created_by = models.ForeignKey(User, blank=True, null=True,  on_delete=models.SET_NULL, editable=False)

    class Meta:
        abstract = True

    objects = ModelPriveManager()


class ModelPriveManager(models.Manager):

    def get_queryset(self):
        user = get_current_user()
        return super().get_queryset().filter(created_by=user)

В моем менеджере get_current_user () возвращает фактического пользователя, который был перехвачен пользовательским промежуточным ПО.

Вот моя форма:

class BlocFormList(ModelForm):
    choix_bloc = forms.ModelChoiceField(queryset = Bloc.objects.all().order_by('nom'), required=True)

    class Meta:
        model = Bloc
        fields = ['choix_bloc']

Вот мой взгляд:

def planification(request):
    form_bloc = BlocFormList()
    if request.method == 'POST':
        # some other code

    return render(request, 'planification.html', locals())

Проблема в том, что когда я выполняю Blo c .objects.all () в представлениях, я получаю ожидаемый ответ (Blo c .objects .filter (создал_бай = пользователь)) но когда это делается внутри набора запросов модели формы, он ничего не возвращает (как если бы не было активного пользователя).

После некоторых проверок я обнаружил, что форма модели набор запросов даже не go в диспетчере.

Если кто-то знает, как это исправить, у меня больше нет идей.

1 Ответ

0 голосов
/ 21 апреля 2020

Видя это сообщение Django Переопределение ModelForm __init __ , я наконец нашел свое решение, переопределив init моего ModelForm:

class BlocFormList(ModelForm):

    blocs = None
    choix_bloc = forms.ModelChoiceField(label='Blocs', queryset=blocs, required=True)

    def __init__(self, *args, **kwargs):
        self.blocs = Bloc.objects.all()
        super(BlocFormList, self).__init__(*args, **kwargs)
        self.fields['choix_bloc'].queryset = self.blocs

    class Meta:
        model = Bloc
        fields = ['choix_bloc']

Это прекрасно работает .

...