어떤 이유로 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>
:
내가 여기 자신의 오류를 트리거하려는 경우에 대한나는 또한 로그인을 제공 할 수 있습니다 이야기하고 오류의 스크린 샷은 내 템플릿입니다
: 여기 forms.pyclass 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')