2014-12-16 3 views
0

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

class CreateStudent(forms.ModelForm): 
    class Meta: 
     model = Student 
     fields = [field.name for field in model._meta.fields if not field.name == 'id'] 


class CreateGroup(forms.ModelForm): 
    class Meta: 
     model = Group 
     fields = [field.name for field in model._meta.fields if not field.name == 'id'] 

Я хочу, чтобы иметь возможность сделать что-то вроде этого:

class CreateItem(forms.ModelForm): 
    class Meta: 
     model = custom_model_name #here I need to pass model from request somehow 
     fields = [field.name for field in model._meta.fields if not field.name == 'id'] 

Я хочу, чтобы ссылки, как /create/Group и /create/User и я хочу передать последнюю часть url (Group или User), чтобы сформировать конструктор и сформировать на нем форму.

+1

Почему бы не просто использовать 'exclude = ['id']' для 'ModelForm' вместо этого? –

+0

Можете ли вы предоставить полную строку, такую ​​как shoud look, например. 'model._meta.fields.exclude' или что? – micgeronimo

+0

вместо 'fields' просто используйте' exclude = ['id'] '. см. здесь https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/#selecting-the-fields-to-use –

ответ

2

Вы не можете сделать это таким образом. Мета-материал оценивается во время определения, поэтому вы не можете его изменить в зависимости от запроса во время выполнения.

Однако, поскольку у вас есть только ограниченное количество моделей, и вы не настраиваете сами формы, почему бы просто не определить формы, а затем использовать словарь, чтобы использовать правильный?

def create(request, model_class): 
    forms = { 
     'user': UserForm, 
     'group': GroupForm 
    } 


    form_class = forms[model_class] 
    ... 
+0

Это отличная идея. Ваши ответы такие классные, как всегда, большое спасибо :) – micgeronimo