2014-01-15 41 views
0

我想呈現表單分組字段。形式實際上是根據傳入的字典中動態創建以django格式分組字段

for f in settings.FORM_BIG_FIELDS: 
     self.fields[f['id']] = eval(f['type'])(label=f['label'], required=f.get('required', True)) 
     self.fields[f['id']].groupp = f.get('group', 1) 

groupp屬性是指相應的組,然後我嘗試呈現它像

{% regroup form.fields.values by groupp as field_group %} 
    {% for group in field_group %} 
    <div class="group_{{ group.grouper }}"> 
      {% for field in group.list %} 
      <p> 
       {{ field.all }} 
       {{ field }} 
      </p> 
      {% endfor %} 
    </div> 
    {% endfor %} 

但作爲輸出我得到以下

<django.forms.fields.CharField object at 0xb527388c> 
<django.forms.fields.IntegerField object at 0xb52738ec> 
<django.forms.fields.ChoiceField object at 0xb527394c> 

我已經讀過這些和BoundField對象不一樣。如何呈現字段或有沒有其他更好的方法來組字段?

+2

您需要的字段集人:HTTPS://pypi.python.org/pypi/django-form-utils –

+0

這是一個可能的解決方案,但我希望沒有額外的庫,只使用本地的。實際上,我設法將它們分組,但是不能將字段呈現爲HTML。 – AskhatOmarov

+0

我正在嘗試使用form-utils。有什麼辦法動態創建字段集?問題是我無法看到類Meta內的字段屬性,因此無法對字段集進行重新分組。我得到的結構是好的,但它不能看到neighher self.fields和領域。 – AskhatOmarov

回答

1

如果你不想使用任何額外的庫,那麼最簡單的解決方案是手動渲染它們,我會說。否則,您只需花費大量時間重複我作爲評論複製的圖書館的功能。

總是有這樣的情況,應該是乾的。但是我們爲用戶和用戶建立的網站很少關注如何在模板中完成表單渲染。出於這個原因,我們經常創建表單模板手動像這樣:組織它節省你一些時間

<div class="something"> 
{{ form.fieldname.label_tag }}{{ form.fieldname }} 
</div> 

Easyest方式。而且在我看來,這也不是那麼糟糕,因爲當你需要現場組織的領域時,這不是很常見。

0

我知道這個問題是比較舊的,但我相信還有誰可以受益於一個簡單的解決方案的人:

假設你有一個組名和成員名單。您可以在表單的init中定義self.fieldset爲{'group_1':['member_1','member_2',...],...}的字典。一旦附加給表單,你可以把它傳遞給意見,並從那裏到模板:

在forms.py:

class MyForm: 
    def __init__(self, current_user, *args, **kwargs):  
     super(YourForm, self).__init__(*args, **kwargs) 
     self.field['group'].queryset = Group.objects.filter(user = current_user) 
     ... 

在views.py:

form = self.Form(current_user) 
the_fieldsets = form.fieldset 

c = {'form': search_form, 
    'fieldsets': the_fieldsets } 

在模板:

{% for field in form %} 
      <tr> 
       <td>{{field.label_tag}}</td> 
       {% if field.name == 'group' %} 
       <td> 

        <select id='{{field.id}}' name='{{field.name}}'> 
         {% for k,v in fieldsets.items %} 
         <optgroup label = {{k.name}}> 
          {% for val in v %} 
           <option name='{{val}} value = {{val.id}}> {{val.name}} </option> # Note that the select needs to return 'id', so value has to be {{val.id}} 
          {% endfor %} 
         </optgroup> 
         {% endfor %} 
        </select> 
       </td>      
       {% else %} 
        <td>{{field}}</td> 
       {% endif %} 

       <td>{{field.help_text}}</td> 
       <td>{{field.errors}}</td> 
      </tr> 
     {% endfor %}