Генерация форм в Джанго - PullRequest
       1

Генерация форм в Джанго

0 голосов
/ 24 апреля 2011

Я хочу генерировать динамические формы в Django.Предположим, что у меня есть модель, которая содержит варианты выбора, который состоит из всех полей форм.Если мой пользователь выберет опцию Textarea и даст имя метки, форма будет отображать текстовую зону с данной меткой.Это может быть текстовый ввод, радио-кнопка и т. Д.

Итак, моя модель выглядит так:

TYPE_CHOICES = (
     (u'TextField',u'TextField'),
     (u'TextArea',u'TextArea'),
)

class SocietyForm(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField()
    form_info = models.ForeignKey(FormInfo)


class FormInfo(models.Model):
    label = models.CharField(max_length=255)
    content_type = models.CharField(max_length=100,choices=TYPE_CHOICES)
    form_info = models.ForeignKey(SocietyForm)

Пока все хорошо, но когда дело доходит до генерации виджетов, ну, я понятия не имею, здесь =Я подумал, что если я сгенерирую словарь в соответствии с выбранным выбором, я могу назначить его виджету формы

'''                                                                                                                                                                                                                                                          
def select_form_type(instance):                                                                                                                                                                                                                              
    dict = {}                                                                                                                                                                                                                                                
    if instance.content_type == "TextField":                                                                                                                                                                                                                 
        dict.update({'%s'instance.label:forms.TextInput()})                                                                                                                                                                                                  
    else:                                                                                                                                                                                                                                                    
        dict.update({'%s'instance.label:forms.Textarea()})                                                                                                                                                                                                   
    return dict                                                                                                                                                                                                                                              
'''

#class SocietyJoinForm(forms.ModelForm,instance):

Но SocietyJoinForm не распознает входные данные экземпляра.Так есть идеи?

1 Ответ

0 голосов
/ 11 мая 2011

Я просто случайно наткнулся на ваш вопрос, глядя на все старые.Дайте мне знать, если вы уже поняли это.

IMO, самый простой способ - использовать Javascript.На самом деле вы не сможете изменить это в Django, если не создадите свой собственный объект формы, и в этом случае вам, скорее всего, все равно придется использовать Javascript.Вы можете сделать что-то вроде этого:

<script type="text/javascript">
    function display_form_obj(){
        var type_selection = document.getElementById('id_content_type');
        var label = document.getElementById('id_label');
        var dyn_obj = document.getElementById('id_dyn_obj_div');
        if( type_selection.value and label.value ){
            // Display the new object
            if( type_selection.value == 'TextField' ){
                dyn_obj.innerHTML = '<textarea ...>';  // Fill it with the info you need
            }
            else {
                dyn_obj.innerHTML = '<input type="text" ...>'; // Fill with needed info
            }
        }
        else {
            dyn_obj.innerHTML = '';
        }
    }

    function set_form_obj_events(){
        var type_selection = document.getElementById('id_content_type');
        var label = document.getElementById('id_label');
        if( label.addEventListener ){
            // Netscape, FF
            type_selection.addEventListener('change', display_form_obj, false);
            label.addEventListener('change', display_form_obj, false);
        }
        elif( label.attachEvent ){
            // IE
            type_selection.attachEvent('onchange', display_form_obj);
            label.attachEvent('onchange', display_form_obj);
        }
    }

</script>
...
<form ... onload="set_form_obj_events();">
    {{form.content_type}}
    {{form.label}}
    <div id="id_dyn_obj_div"></div>
    ...
</form>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...