Найти - Пользователи
Полная версия: Forms. Передача параметров из views.py в class Meta у forms.ModelForm
Начало » Django » Forms. Передача параметров из views.py в class Meta у forms.ModelForm
1 2
barabansheg
Доброго времени суток! Подскажите пожалуйста, как я могу вот в таком коде:
class AnyForm(forms.ModelForm):
    def __init__(self, myvar, *args, **kwargs):
        super(AnyForm, self).__init__(*args, **kwargs)
    class Meta:
        test = myvar

обратится к myvar внутри class Meta? myvar приходит из views.py. Мой код выдает “name ‘myvar’ is not defined”
Ferroman
А как вы это делаете? Обращаетесь к переменной класса, или переменной инстанса?
barabansheg
А вот понять не могу как обратится нужно. Нужно то по идее присвоить переменной model в class Meta значение полученное из views.py. Насколько я понял model вообще не является членом класса. Или нет?

Просто все формы у меня 1 в 1 как модели. Хочется получать форму из параметров адресной строки. Может я велосипед изобретаю и есть более простое решение?
Ferroman
barabansheg
А вот понять не могу как обратится нужно. Нужно то по идее присвоить переменной model в class Meta значение полученное из views.py
Нет, так сделать нельзя. Meta используется во время инициализации класса. Но можно попробовать сделать это, если мне не изменяет память, в AnyForm._meta - это свойство должно дать вам возможность поменять параметр test на нужный. Но я слабо представляю как это связано с похожесть форм и моделей.
Вы объясните подробнее что вы хотите сделать, посоветовать будет проще.
barabansheg
У меня есть модели. Под каждую из них нужна форма. Если под каждую модель копировать код:
class AnyForm(forms.ModelForm):
    class Meta:
        model = any_model
то получается много повторяющегося кода. Хочется универсальный класс, который в зависимости от имени модели вернет форму этой модели.
Ferroman
Model formsets?
barabansheg
Наверно, если пошаманить, то пойдет. Поиграюсь, спасибо. =) Изменить AnyForm._meta не прокатило. Выдает ошибку, что у формы нет аттрибута _errors.

Этот модуль создан для того, что бы редактировать несколько форм на странице. Не совсем то. Ну, да ладн.

———————
Вот так работает как мне и нужно:

class StandartForm(forms.ModelForm):
    def __init__(self, model, *args, **kwargs):
        super(StandartForm, self).__init__(*args, **kwargs)
        self._meta.model = get_model('app_label', model.title()) # меняем на нужную
    class Meta:
        model = AnyModel # задается любая существующая модель
Спасибо огромное за помощь!
Ferroman
Он позволяет создать моделформу динамически вместо статического объявления. По-моему как раз то, что вам нужно.
vvpoloskin
def generate_form(model):
        class Meta:
             model = Model
        return type('%sForm'%model, (ModelForm, ), {'Meta':Meta})
form_list = [generate_form(i) for i in model_list]


А можно ещё круче:

class StandartModel(Model):
        @classmethod
        def form(cls, *args, **kwargs):
             class Meta:
                  model = cls
              return type('%sForm'%model, (ModelForm, ), {'Meta':Meta})
           
Таким образом у тебя для каждой модели будет метод form, возвращающий форму:)
zheromo
Используйте CBV
class MyView(CreateView):
    model = MyModel
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB