gpt4 book ai didi

python - CreateView 中的多个表单和表单集

转载 作者:太空狗 更新时间:2023-10-29 16:56:15 26 4
gpt4 key购买 nike

我有 2 个模型,FatherSon

我有一个注册父亲的页面。在同一页面上,我有一个用于注册 Son 的表单集。

页面上有一个“更多”按钮,用于在同一页面上添加另一个Father 和他们各自的Son

有没有人有任何使用 CreateView 的例子?

最佳答案

基于类的 View 仍然是新的,所以我会把它写出来。过程很简单:

首先,为您的对象创建表单。将重复其中一种形式。这里没什么特别的。

class SonInline(ModelForm):
model = Son

class FatherForm(ModelForm):
model = Father

然后,创建您的 formset :

FatherInlineFormSet = inlineformset_factory(Father,
Son,
form=SonInline,
extra=1,
can_delete=False,
can_order=False
)

现在,将它与您的 CreateView 集成:

class CreateFatherView(CreateView):
template_name = 'father_create.html'
model = Father
form_class = FatherForm # the parent object's form

# On successful form submission
def get_success_url(self):
return reverse('father-created')

# Validate forms
def form_valid(self, form):
ctx = self.get_context_data()
inlines = ctx['inlines']
if inlines.is_valid() and form.is_valid():
self.object = form.save() # saves Father and Children
return redirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))

def form_invalid(self, form):
return self.render_to_response(self.get_context_data(form=form))

# We populate the context with the forms. Here I'm sending
# the inline forms in `inlines`
def get_context_data(self, **kwargs):
ctx = super(CreateFatherView, self).get_context_data(**kwargs)
if self.request.POST:
ctx['form'] = FatherForm(self.request.POST)
ctx['inlines'] = FatherInlineFormSet(self.request.POST)
else:
ctx['form'] = Father()
ctx['inlines'] = FatherInlineFormSet()
return ctx

最后,这是模板:

关键部分是jquery django-dynamic-formset不断添加新内联表单的插件:

<form id="father-form" method="POST" enctype="multipart/form-data" action=".">
{% csrf_token %}
<div class="row">
{% for f in form %}
<div class="span3">{{ f.label }}<br />{{ f }}
{% if f.errors %}
{% for v in f.errors %}
<br /><span style="color:red;">{{ v }}</span>
{% endfor %}
{% endif %}
</div>
{% endfor %}
</div>
<hr />
<h2>Sons:</h2>
<table class="table-striped">
<table>
{% for f2 in inlines %}
<tr id="{{ f2.prefix }}-row">
{% for i in f2 %}
<td>
{{ i }}{% if i.errors %}<span style="color:red;">{{ i.errors }}</span>{% endif %}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{{ inlines.management_form }}
<input type="submit" class="btn btn-primary" value="Go Go Gadget &rarr;">
</form>
<script type="text/javascript">
$(function() {
$('#father-form tr').formset({
prefix: '{{ inlines.prefix }}'
});
})
</script>

关于python - CreateView 中的多个表单和表单集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12573992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com