Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Createview for generic Model

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!

like image 370
Nunovsky Avatar asked Jul 29 '14 10:07

Nunovsky


2 Answers

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.)

like image 175
meshy Avatar answered Sep 18 '22 01:09

meshy


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.

like image 41
Daniel Roseman Avatar answered Sep 20 '22 01:09

Daniel Roseman