Django view с именем переменной формы - PullRequest
1 голос
/ 21 апреля 2011

Мне было интересно использовать один и тот же вид для нескольких форм в зависимости от просматриваемого проекта. Не знаю, почему я не могу разобраться с этим, может быть, проблема «леса для деревьев».

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

Моя попытка заключалась в том, чтобы поместить имя формы CharField в проект, который содержит имя формы - project.form_name = "project_specific_form". Когда представление вызывается, передается идентификатор проекта. Я попытался заменить стандартный вызов формы «a = SomeForm ()» на «a = project.form ()», чтобы получить конкретную форму для этого проекта. Это не сработало. Я также попытался использовать несколько версий конкатонирования строк с exec, но безрезультатно.

Есть предложения?

1 Ответ

1 голос
/ 21 апреля 2011

Почти никогда нет причин использовать exec.

Определите метод в модели для возврата формы.Вы можете использовать функцию globals(), которая возвращает словарь всех атрибутов уровня модуля:

class Project(model.Model):
    ...

    def get_form(self):
        form = globals()[self.form]
        return form

, но я думаю, что лучшим способом было бы определить словарь уровня модуля со всеми формами:

project_forms = {
    'foo': FooForm
    'bar': BarForm
}

class Project(models.Model):
    def get_form(self):
        return project_forms[self.form]

Обратите внимание, что значения словаря являются фактическими классами форм, а не их именами.

...