2012-09-13 1 views
0

어떤 이유로 django-dynamic-formset을 구현 한 것이 약간 재미 있습니다.django-dynamic-formset은 formset 당 두 개의 추가/제거 링크를 만듭니다.

내 템플릿의 각 동적 formset에 대해 두 개의 추가/제거 링크를 만듭니다.

나는 이것을 조금만 알아 내려고 노력하면서 주위를 둘러 보았고, 나에게 최고를 얻었습니다.

<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> 

:

here

내가 여기 자신의 오류를 트리거하려는 경우에 대한

나는 또한 로그인을 제공 할 수 있습니다 이야기하고 오류의 스크린 샷은 내 템플릿입니다

: 여기 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')  

답변

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> 

그런 다음, 자바 스크립트에서 당신이 (당신의 formset의 삶의 필드 임)이이 플러그인이 적절한 ID와 이름, 돈으로 복제하는 코드를 잡아 곳 올바른 선택을 할 필요가 pset을 "formset"의 "접두어"로 사용하는 것을 잊지 마십시오.

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

플러그인이 자동으로 제거 및 추가 버튼을 만듭니다.

관련 문제