как найти связанный Django ModelForm с учетом модели - PullRequest
0 голосов
/ 19 марта 2011

У меня есть десятки Моделей, каждая с ОДНОЙ ассоциированной ModelForm (чья Meta.model относится к рассматриваемой модели).

Например,

class FooModel(Model):
    pass

class FooModelForm(ModelForm):
    class Meta:
        model = FooModel

# current approach using a classmethod
FooModelForm.insert_in_model()  # does cls.Meta.model.form = cls

Так что, очевидно, легконайти FooModel, заданную FooModelForm.Я хочу знать, как лучше всего выполнить REVERSE: найти FooModelForm, когда мне представляется FooModel или даже строка «Foo».

Предполагается только один ModelForm для каждой модели, хотя решения, которые возвращают множественное число,хорошо.

Мой текущий подход - хранить модель в классе формы (как показано выше), но мне интересно знать лучшие подходы, особенно те, которые могли бы вычислять ее централизованно (без последней строки выше).

РЕДАКТИРОВАТЬ: Я рассмотрел такие вещи, как Django: Показать Generic ModelForm или предопределенную форму , но я считаю, что это более простой вопрос, чем те.Код администратора Django должен делать то, что я ищу.Но эквивалент get_model для ModelForms? предполагает, что это может быть вуду, и что было бы лучше просто сделать dict['Foo']=FooModelForm или его эквивалент, чтобы явно отслеживать ассоциацию.Кажется скучным.

1 Ответ

1 голос
/ 19 марта 2011

Если у вас менее 20 форм, кажется, что составление словаря - самый простой способ. Джанго тоже делает подобные вещи внутренне.

Для ModelForms администратор django просто создает их на лету с помощью modelform_factory, поэтому нет способа, сравнимого с get_model


Понятно, ваш метод является пуленепробиваемым, но требует строки в любой модели.

Если у вас есть только один ModelForm на model, вы потенциально можете перебирать подклассы ModelForm, пока не найдете свою форму.

найти FooModelForm, когда меня представят с FooModel или даже строкой "Foo".

modelforms = forms.ModelForm.__subclasses__()
def get_modelform(model):
    try:
        return filter(lambda x:x.Meta.model == model, modelforms)[0] 
    except IndexError:
        print "apparently, there wasn't a ModelForm for your model"

Если вы хотите вытянуть ModelForm как строку, вам нужно убедиться, что оба app_label и __name__ верны, что означает, что будет проще использовать get_model('app', 'model') в функции.

Вы можете комбинировать это с вашим методом и автоматически размещать атрибут в ваших моделях, который указывает на его ModelForm.

Подключите сигнал class_prepared вверху ваших приложений, найдите соответствующий ModelForm и присоедините его к вашему классу Model. Надеюсь, что это помогает или дает вам некоторые идеи.

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