Question

I've been searching really hard for this, and i can't find it anywhere. So, here it goes:

I'm trying to build an generic class that takes a generic Model as parameter and creates a form for it. For this i'm using Django's ModelForm and CreateView classes. The main goal to this, is when i need to create a new form, i just declare a new URL passing the Model name.

urls.py

url(r'^create', GenericCreate(model=Author).as_view(), name='create'),

views.py

class GenericCreate(CreateView):

    def __init__(self, model, *args, **kwargs):
        super(GenericCreate, self).__init__(*args, **kwargs)
        self.form_class = to_modelform(self.model)

to_modelform is a function that i implemented that converts a model to a modelform, and it works.

This gives me the following error:

AttributeError at /create This method is available only on the view class.

Thank you in advance!

Was it helpful?

Solution

You should not be creating an instance of the view class, as_view will do that for you.

You would normally call ViewClass.as_view(), not ViewClass().as_view().

Also, CreateView already takes model as a parameter, so you should define your url as:

url(r'^create', CreateView.as_view(model=Author), name='create'),

For a proper look at how this works, have a look at the as_view method on CreateView. (Full disclosure -- I built ccbv.co.uk.)

OTHER TIPS

meshy has provided the answer, but note that your to_modelform function is unnecessary. CreateView works perfectly well with a model or model instance rather than a form, see the documentation.

I had this error as well (TypeError: 'instance' is an invalid keyword argument for this function); for me it was related to defining the Model instead of the Form in form_class.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top