Skip to main content
 首页 » 编程设计

python之覆盖 Django 的 get_form_class() 方法抛出字符串错误

2025年05月04日47cyq1162

我有一个基于类的 View ,它应该根据动物的名称动态选择一个表单。

UpdateAnimalView(FormMixin, DetailView): 
  def get_form_class(self): 
    SOME_FORMS = { 
        "Dog" : "UpdateDogForm", 
        "Cat" : "UpdateCatForm", 
        "Frog" : "UpdateFrogForm", 
    } 
    animal = object 
    animal_type = object.type #returns "Dog", "Cat" or "Frog" 
    form_class_name = SOME_FORMS[animal_type] 
    #form_class_name now takes the values "UpdateDogForm" 
    #, "UpdateCatForm" or "UpdateFrogFrom" 
    return form_class_name 

但是,当我运行它时,它似乎不是读取 form_class 而是作为 string 并且 Django 抛出此错误:

'str' 对象不可调用

回溯来自 get_context_data。我推断调用堆栈如下:

def get_form(self, form_class=None): 
    form = super(UpdateAnimalView, self).get_form() 
    return form 
 
def get_context_data(self, **kwargs): 
    context = super(UpdateAnimalView, self).get_context_data(**kwargs) 
    context['form'] = self.get_form() 
    return context 

如何将 form_class 作为其正确的数据类型而不是字符串返回?

请您参考如下方法:

get_form_class 应该返回实际的类,而不是它的名字:

# import the form classes from wherever they live 
from .forms import UpdateDogForm, UpdateCatForm, UpdateFrogForm 
... 
SOME_FORMS = { 
    "Dog": UpdateDogForm,   # <- no string values here! 
    "Cat": UpdateCatForm,   # <- 
    "Frog": UpdateFrogForm, # <- 
}