django 中的 Modelformset 泛型 CreateView 和 UpdateView
Modelformset in django generic CreateView and UpdateView
我有一个包含两个字段 'id' 和 'name' 的模型组织。我打算使用动态模型 formsets.The 代码来填充它,目前我的代码如下。
表格
class OrganizationForm(forms.ModelForm):
class Meta:
model = Organization
fields = ('name',)
OrganizationFormset = modelformset_factory(Organization, form=OrganizationForm, fields=('name', ), extra=1)
观看次数
class OrganizationCreate(CreateView):
model = Organization
form_class = OrganizationForm
def get_context_data(self, **kwargs):
context = super(OrganizationCreate, self).get_context_data(**kwargs)
context['formset'] = OrganizationFormset()
return context
def post(self, request, *args, **kwargs):
formset = OrganizationFormset(request.POST)
if formset.is_valid():
return self.form_valid(formset)
def form_valid(self, formset):
formset.save()
return HttpResponseRedirect('/')
def form_invalid(self, formset):
return self.render_to_response(self.get_context_data(formset=formset))
class OrganizationUpdate(UpdateView):
model = Organization
form_class = OrganizationForm
template_name_suffix = '_update_form'
def get_context_data(self, **kwargs):
context = super(OrganizationUpdate, self).get_context_data(**kwargs)
context['formset'] = OrganizationFormset()
return context
def post(self, request, *args, **kwargs):
formset = OrganizationFormset(request.POST)
if formset.is_valid():
return self.form_valid(formset)
def form_valid(self, formset):
formset.save()
return HttpResponseRedirect('/')
def form_invalid(self, formset):
return self.render_to_response(self.get_context_data(formset=formset))
模板
创建
<form id="myForm" method="post" action="">
{% csrf_token %}
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
{{ form }}
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
{% for form in formset.forms %}
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
<tr>
<td>
{% if form.instance.pk %}{{ form.DELETE }}{% endif %}
{{ form.field1 }}
</td>
<td>{{ form.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ formset.management_form }}
<input type="submit" value="Create Location">
</form>
更新
<form id="myForm" method="post" action="">
{% csrf_token %}
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
{% for form in formset.forms %}
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
<tr>
<td>
{% if form.instance.pk %}{{ form.DELETE }}{% endif %}
{{ form.field1 }}
</td>
<td>{{ form.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ formset.management_form }}
<input type="submit" value="Update organizations">
</form>
但是,创建模板和更新模板都会显示预先存在的组织,而这应该只发生在更新模板中。而且,删除更新页面中已有的组织returns出现如下错误:
The view aims.views.OrganizationUpdate didn't return an HttpResponse object. It returned None instead.
我是 django 通用视图和使用表单集的新手。我做错了什么?
提前致谢。
当 formset 在两个基于 Class 的视图(创建和更新)中无效时,您的 post 方法 return 什么都没有,您应该 return form_invalid
在 else
分支中:
if formset.is_valid():
return self.form_valid(formset)
else:
return self.form_invalid(formset)
默认情况下 django model formsets
将显示它可以从数据库中找到的任何项目。所以你必须在创建一个时覆盖 queryset
参数,让它知道要使用哪些项目以及何时使用。例如,您应该提供 -
Organization.objects.none()
像这样创建视图 -
class OrganizationCreate(CreateView):
...
def get_context_data(self, **kwargs):
...
context['formset'] = OrganizationFormset(queryset=Organization.objects.none()) # providing none
def post(self, request, *args, **kwargs):
...
def form_valid(self, formset):
...
def form_invalid(self, formset):
...
这将强制表单集呈现空白表单。同样更改更新视图以编辑特定项目 -
class OrganizationUpdate(UpdateView):
...
def get_context_data(self, **kwargs):
context = super(OrganizationUpdate, self).get_context_data(**kwargs)
context['formset'] = OrganizationFormset(queryset=Organization.objects.get(pk=< get the pk from url when editing>))
return context
def post(self, request, *args, **kwargs):
...
def form_valid(self, formset):
...
def form_invalid(self, formset):
...
希望这能解决您的问题。如果您仍然看到问题,请使用网址的详细信息和可能的屏幕截图更新问题。我会看看我能做什么。
我有一个包含两个字段 'id' 和 'name' 的模型组织。我打算使用动态模型 formsets.The 代码来填充它,目前我的代码如下。
表格
class OrganizationForm(forms.ModelForm):
class Meta:
model = Organization
fields = ('name',)
OrganizationFormset = modelformset_factory(Organization, form=OrganizationForm, fields=('name', ), extra=1)
观看次数
class OrganizationCreate(CreateView):
model = Organization
form_class = OrganizationForm
def get_context_data(self, **kwargs):
context = super(OrganizationCreate, self).get_context_data(**kwargs)
context['formset'] = OrganizationFormset()
return context
def post(self, request, *args, **kwargs):
formset = OrganizationFormset(request.POST)
if formset.is_valid():
return self.form_valid(formset)
def form_valid(self, formset):
formset.save()
return HttpResponseRedirect('/')
def form_invalid(self, formset):
return self.render_to_response(self.get_context_data(formset=formset))
class OrganizationUpdate(UpdateView):
model = Organization
form_class = OrganizationForm
template_name_suffix = '_update_form'
def get_context_data(self, **kwargs):
context = super(OrganizationUpdate, self).get_context_data(**kwargs)
context['formset'] = OrganizationFormset()
return context
def post(self, request, *args, **kwargs):
formset = OrganizationFormset(request.POST)
if formset.is_valid():
return self.form_valid(formset)
def form_valid(self, formset):
formset.save()
return HttpResponseRedirect('/')
def form_invalid(self, formset):
return self.render_to_response(self.get_context_data(formset=formset))
模板 创建
<form id="myForm" method="post" action="">
{% csrf_token %}
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
{{ form }}
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
{% for form in formset.forms %}
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
<tr>
<td>
{% if form.instance.pk %}{{ form.DELETE }}{% endif %}
{{ form.field1 }}
</td>
<td>{{ form.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ formset.management_form }}
<input type="submit" value="Create Location">
</form>
更新
<form id="myForm" method="post" action="">
{% csrf_token %}
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
{% for form in formset.forms %}
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
<tr>
<td>
{% if form.instance.pk %}{{ form.DELETE }}{% endif %}
{{ form.field1 }}
</td>
<td>{{ form.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ formset.management_form }}
<input type="submit" value="Update organizations">
</form>
但是,创建模板和更新模板都会显示预先存在的组织,而这应该只发生在更新模板中。而且,删除更新页面中已有的组织returns出现如下错误:
The view aims.views.OrganizationUpdate didn't return an HttpResponse object. It returned None instead.
我是 django 通用视图和使用表单集的新手。我做错了什么?
提前致谢。
当 formset 在两个基于 Class 的视图(创建和更新)中无效时,您的 post 方法 return 什么都没有,您应该 return form_invalid
在 else
分支中:
if formset.is_valid():
return self.form_valid(formset)
else:
return self.form_invalid(formset)
默认情况下 django model formsets
将显示它可以从数据库中找到的任何项目。所以你必须在创建一个时覆盖 queryset
参数,让它知道要使用哪些项目以及何时使用。例如,您应该提供 -
Organization.objects.none()
像这样创建视图 -
class OrganizationCreate(CreateView):
...
def get_context_data(self, **kwargs):
...
context['formset'] = OrganizationFormset(queryset=Organization.objects.none()) # providing none
def post(self, request, *args, **kwargs):
...
def form_valid(self, formset):
...
def form_invalid(self, formset):
...
这将强制表单集呈现空白表单。同样更改更新视图以编辑特定项目 -
class OrganizationUpdate(UpdateView):
...
def get_context_data(self, **kwargs):
context = super(OrganizationUpdate, self).get_context_data(**kwargs)
context['formset'] = OrganizationFormset(queryset=Organization.objects.get(pk=< get the pk from url when editing>))
return context
def post(self, request, *args, **kwargs):
...
def form_valid(self, formset):
...
def form_invalid(self, formset):
...
希望这能解决您的问题。如果您仍然看到问题,请使用网址的详细信息和可能的屏幕截图更新问题。我会看看我能做什么。