2010-02-10 2 views
2
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, модель всегда игнорируется.Динамическое обновление модели модели модели ModelForm

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

ответ

0

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

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

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

Dammit

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

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

0

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

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

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

0

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

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

1
def get_form(model_class): 
    class DynamoForm(forms.ModelForm): 
     class Meta: 
      model = model_class 

    return DynamoForm 


form_set = get_form(ActualModel)(request.POST) 

является то, что вы хотите?

Смежные вопросы