0

モデルの設定方法は次のとおりです。

class ModelA(models.Model):
    user = models.ForeignKey(User)
    modelB = models.ForeignKey('ModelB', related_name='modelB')
    # more fields here

class ModelB(models.Model):
    user = models.ForeignKey(User)
    # more fields here

両方のクラスのユーザーフィールドは、後で同じユーザーが両方を照会できるようにするためのものです。

ModelBのModelFormがあり、ユーザーがModelBModelFormに動的な数のModelAインスタンスを入力できるようにしたいと考えています。ModelBのフォームにModelAの1つのインスタンスを入力して開始してから、ユーザーがModelBのフォームにさらにModelAを追加できるようにしたいと思います。

私は個人的なプロジェクトとしてこれに固執していて、本当に前進したいと思っています。助けてくれてありがとう!

編集1:ModelFormsをオーバーロードすることで何らかの作業を行う必要がある可能性が高いことはわかっていますdef __init__が、それは私が得た範囲です。また、ClassBasedGenericビュー(後で追加を機能させるためのCreateViewとEditView)を使用していますが、必要に応じて、そこから離れることをいとわないです。

4

1 に答える 1

1

djangoインラインフォームセットが必要です

ビューで:

f_set = inlineformset_factory(ModelB, ModelA, extra=1)

divテンプレートでは、IDがone_to_many:であるform_setをレンダリングしていると仮定します。

<form>
   <div id="one_to_many">
       {{f_set.as_table}}
   </div>
</form>

#This will render some thing like this
<form>
    <div id="one_to_many">
        <table>
            <tr>
               <th>
                   <label for="id_form-0-field_name">Field Name:</label>
               </th>
               <td>
                  <input id="id_form-0-field_name" type="text" name="form-0-field_name" value="" maxlength="100" />
                  <input type="hidden" name="form-0-id" value="1" id="id_form-0-id" />  
                </td>
            </tr>
        </table>
        <input type="button" value="Add More Field" id="add_more">
    </div>
</form>

次に、jqueryフィールドを動的に追加する部分:

$(document).ready(function(){
        $('#add_more').click(function(){
            var tbl = $('#one_to_many').children('table');
            var last_id = parseInt(tbl.find('input[type=hidden]').last().val());
            var next_id = last_id + 1;
            htm = '<tr><th><label for="id_form-'+last_id+'-field_name">Field Name:</label></th><td><input id="id_form-'+last_id+'-field_name" type="text" name="form-'+last_id+'-field_name" value="" maxlength="100" /><input type="hidden" name="form-'+last_id+'-id" value="'+next_id+'" id="id_form-'+last_id+'-id" /></td></tr>'
            tbl.find('tr').last().after(htm);

        });    
    });

これはjsfiddleでテストできます。これは、フォームをレンダリングする場合にのみ機能することに注意してくださいas_table

于 2012-11-15T20:22:03.500 に答える