Как передать модель из CBV в ModelForm - PullRequest
1 голос
/ 08 января 2020

У меня есть view, который я хочу использовать с пользовательским form_class:

class CustomCreateView(CreateView):
    form_class = CustomCreateForm
    fields = ['field1', 'field2']

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

class CreateBook(CustomCreateView)
     model = Books

class CreateCar(CustomCreateView)
     model = Cars

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

Есть ли способ сделать это? Например,

class CustomCreateForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        model = kwargs.pop('model')
        self._meta.model = model
        super(CustomCreateForm, self).__init__(*args, **kwargs)

    class Meta:
       fields = '__all__'

1 Ответ

2 голосов
/ 08 января 2020

Вы можете создать фабрику классов форм, передать ей модель и создать динамический c класс форм. Переопределите get_form_class метод в представлении и вызовите фабрику форм там следующим образом

def form_class_factory(model_class):
    class CustomCreateForm(forms.ModelForm):
        class Meta:
           model = model_class
           fields = '__all__'
    return CustomCreateForm

В представлении

class YourView(CustomCreateView)
     model = Cars

     def get_form_class(self):
         return form_class_factory(self.model)
...