Динамическое обновление поля модели Meta-класса ModelForm - PullRequest
2 голосов
/ 10 февраля 2010
def SiteAdminForm(model_cls, *args, **kwargs):
    class MerchantAdminForm(forms.ModelForm):
        class Meta:
            exclude = ('external_links', 'published', 'logo','image_zip_file',)
            model = model_cls

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

    return MerchantAdminForm()

# In use...
merchant_form = SiteAdminForm(merchant.__class__, instance=merchant)

Независимо от того, что передано в model_cls, модель всегда игнорируется.

Meta.exclude установлено правильно, как я могу динамически обновить Meta.model?

Ответы [ 4 ]

1 голос
/ 20 декабря 2013
def get_form(model_class):
    class DynamoForm(forms.ModelForm):
        class Meta:
            model = model_class

    return DynamoForm


form_set = get_form(ActualModel)(request.POST)

это то, что вы хотите?

0 голосов
/ 10 февраля 2010

Попробуйте использовать так:

merchant_form = SiteAdminForm(merchant.model, instance=merchant)

Одним из предложений является использование оболочки Python (в случае django, оболочки ./manage.py) для проверки атрибутов и методов объекта с помощью встроенной функции dir ().

0 голосов
/ 11 февраля 2010

Я идиот, спал на нем, снова посмотрел и почти сразу понял !!!!

return MerchantAdminForm() должно было быть: return MerchantAdminForm(*args, **kwargs)

0 голосов
/ 10 февраля 2010

Это потому, что ваш merchant.__class__ также django.db.models.base.ModelBase. Если вы просто попытаетесь напечатать торговца, вы получите правильный путь к классу (я получаю app.models.TestModel), но class - это BaseModel.

Я полагаю, это из-за использования метаклассов. Вероятно, метакласс устанавливает класс объекта в ModelBase. Django широко использует эту функцию Python, и это может вызвать странное поведение (что означает странное для людей, которые не совсем понимают, как я ;-), не то, что это не работает). Я попытаюсь взглянуть на код Django - вы тоже должны: -)

Во всяком случае, вы получаете то, что вы хотите внутри формы, и это должно работать просто отлично: -)

ЧЕРТ ВОЗЬМИ

Конечно, я знаю, почему это происходит. Вы спрашиваете о классе класса, вы знаете. Внутри формы. Meta.model - это класс, который вы передали в форму. Вот почему вы получаете ModelBase - вы получаете метакласс.

Стоит прочитать о метаклассах, потому что они классные. Хотя они тоже немного сложны ;-) Здесь вы можете прочитать о них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...