0

どういうわけか、私のdjango-dynamic-formsetの実装は少しおかしな動作をしています。

テンプレートの動的フォームセットごとに2つの追加/削除リンクを作成しています。

私はこれを少しの間理解しようとしていじくり回していて、それは私の最高のものになりました。

これが私が話しているエラーのスクリーンショットです

自分でエラーをトリガーしたい場合は、ログインを提供することもできます。これが私のテンプレートです。

<head>
    <script type="text/javascript" src="{{ STATIC_URL }}jquery.formset.js"></script>
    <script type="text/javascript">
       $(function() {
           $('#ingredients tbody tr').formset({
               prefix: '{{ ingredients_formset.prefix }}',
               formCssClass: 'dynamic-ingredients'
           });
            $('#steps tbody tr').formset({
               prefix: '{{ steps_formset.prefix }}',
               formCssClass: 'dynamic-steps'
           });
       })
   </script>
</head>
<body>
<form action="{% url cookbook.views.createrecipe %}" method="POST" id="ingredients">
    {% csrf_token %}
<table>
    <tbody>
        <tr>
            <label>
                Ingredients:
            </label>
        </tr>

        <tr>
            <td>
                <input type="text" cols="40" rows="10" />
            </td>
        </tr>
    </tbody>
</table>
</form>
<form action="{% url cookbook.views.createrecipe %}" method="POST" id="steps">
    {% csrf_token %}
<table>
    <tbody>
        <label>
            Steps:
        </label>
        <tr>
            <td>
                <input type="text"  cols="40" rows="10" />
            </td>
        </tr>
    </tbody>
</table>
</form>
</body>

これがforms.pyです

class RecipeForm(forms.ModelForm):
    reset_recipe = forms.CharField(widget=forms.HiddenInput(), required = False)
    class Meta:
        model = Recipe
        widgets = {'original_cookbook':forms.HiddenInput(),
                    'pub_date':forms.HiddenInput(),
                    'author':forms.HiddenInput()}

        fields =("name", "picture","ingredients","steps","prep_time","type",'reset_recipe')

class CookbookForm(forms.ModelForm):
    class Meta:
        model = Cookbook


class StepsForm(forms.Form):
    Step = forms.CharField()

StepsFormSet = formset_factory(RecipeForm, StepsForm, can_order=True, can_delete=True, extra = 0)

class IngredientsForm(forms.Form):
    Ingredient = forms.CharField()

IngredientsFormSet = formset_factory(RecipeForm, IngredientsForm, can_order=True, can_delete=True, extra = 0)

とビュー:

def createrecipe(request):
    RecipeForm = RecipeForm(request.POST)
    IngredientsFormSet = formset_factory(IngredientsForm)
    StepsFormSet = formset_factory(StepsForm)
    if request.method == 'POST':
        form = RecipeForm(request.POST)
        ingredients_formset = IngredientsFormSet(request.POST, request.FILES, prefix='ifs')
        steps_formset = StepsFormSet(request.POST, request.FILES, prefix='sfs')
        if form.is_valid() and ingredients_formset.is_valid() and steps_formset.is_valid():
            print "form is valid"
            new_recipe = form.save(commit=False)
            new_recipe.original_cookbook = request.user.cookbooks.all()[0]
            new_recipe.author = request.user.cookbooks.all()[0].name
            new_recipe.steps = steps_formset
            new_recipe.ingredients = ingredients_formset
            new_recipe.save()
            cookbooks = request.user.cookbooks.all()
            cookbook = cookbooks[0]
            cookbook.recipes.add(new_recipe)
            form.save_m2m()             
            t = loader.get_template('cookbook/create_form.html')
            c = RequestContext(request, {
            'form': new_recipe,
            })

            data = {
            'replace': True,
            'form': t.render(c),
            'success': True,
            }

            json = simplejson.dumps(data)
            return HttpResponse(json, mimetype='text/plain')
        else:
            print "form is invalid"
            form = RecipeForm(request.POST)
            ingredients_formset = IngredientsFormSet(request.POST, request.FILES, prefix='ifs')
            steps_formset = StepsFormSet(request.POST, request.FILES, prefix='sfs')
            t = loader.get_template('cookbook/create_form.html')
            c = RequestContext(request, {
                'form':form,
            })

            data ={
                'form': t.render(c),
                'success': False,
            }

            json = simplejson.dumps(data)
            return HttpResponse(json, mimetype='text/plain')    
4

1 に答える 1

0

ELO80KAによる素晴らしいdjango-dynamic-formset jQuery プラグインを使用できます

私は今、プロジェクトでそれを使用しています。私が今どのようにそれを行っているかをお見せしましょう。マークアップを見てみましょう:

<div id="id_p_i_c_formset_div">
{% for form in p_i_c_formset.forms %}
    <div class="p_i_c_child_formset row-fluid">
        {{ form.id }}
        <h2>year</h2>
        {{ form.year }}
        <h2>product_category</h2>
        {{ form.product_category }}
        <h2>insurance_company</h2>
        {{ form.insurance_company }}
        <h2>value</h2>
        {{ form.value|attr:"placeholder:insurance_claims" }}
        <h2>result</h2>
        {{ form.result }}
    </div>
{% endfor %}
{{ p_i_c_formset.management_form }}
</div>

次に、javascript で正しいセレクター (フォームセットのフィールドが存在する場所) を実行する必要があります。ここで、プラグインがコードを取得して、適切な ID と名前でクローンを作成します。「プレフィックス」のフォームセット:

$(function(){
    $('form#my-personal-info #id_p_i_c_formset_div .p_i_c_child_formset').formset({
        prefix: '{{ p_i_c_formset.prefix }}'
    });
});

プラグインは、削除および追加ボタンを自動的に作成します。

于 2013-04-18T16:17:54.683 に答える