2016-05-29 10 views
0

Ich habe eine klassenbasierte Ansicht, die ein Formular basierend auf dem Namen des Tieres dynamisch auswählen soll.Das Überschreiben von Djangos Methode get_form_class() löst einen Stringfehler aus

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 

Allerdings, wenn ich dies ausführen, scheint es nicht die form_class sondern als string und Django wirft diesen Fehler zu lesen:

'str' object is not callable

Die Zurückverfolgungs vom get_context_data ist. Ich schließe die Aufrufliste ist wie folgt:

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 

Wie kann ich die form_class als sein korrekten Datentyp und nicht als String zurück?

Antwort

3

get_form_class sollte die tatsächliche Klasse zurückgeben, nicht seinen Namen:

# 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, # <- 
} 
+0

Wow das war eindeutig ein Amateur-Fehler. Danke für das Debuggen. – bryansis2010