Django通用CreateView和UpdateView中的Modelformset

韦达瓦

我有一个具有两个字段“ id”和“ name”的组织模型。我打算使用动态模型表单集填充它。到目前为止,我的代码如下。

形式

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>

但是,创建模板和更新模板都显示先前存在的组织,而这仅应在更新模板中发生。此外,删除更新页面中的现有组织将返回以下错误:

The view aims.views.OrganizationUpdate didn't return an HttpResponse object. It returned None instead.

django通用视图和表单集是我的新手。我做错了什么?

提前致谢。

无脑的编码员

默认情况下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):
        ...

希望这可以解决您的问题。如果您仍然发现问题,请使用网址的详细信息和可能的屏幕截图更新问题。我会看到我能做什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django CreateView 结合 modelformset 和 inlineformset

Django CreateView 结合 modelformset 和 inlineformset

从Django中的通用CreateView转发HTTP?

如何判断我是使用模板的django通用视图(CreateView还是UpdateView)进行创建或更新?

Django UpdateView通用类

通用模型的Django Createview

在Django中检查通用UpdateView中的条件的位置

如何将createview中创建的对象权限传递给django中的updateview

Django在CreateView中禁用/排除字段,但在UpdateView中启用/包含它

在通用 CreateView 中获取和显示请求参数的最佳方法

Django模板中的ListView和CreateView

在Django 1.6中结合DetailView和CreateView

在与 Django 中的 CreateView 表单相同的页面上显示 UpdateView 表单

Django中的UpdateView问题

Django通用UpdateView。如何检查凭证

Django通用UpdateView安全性问题

有什么方法可以结合CreateView和UpdateView?

如何在Django的单个视图中组合通用`detailsView`和`CreateView`

CreateView 中的 AttributeError - Django

使用通用视图(CreateView)在Django中限制外键下拉列表中的选择

在 CreateView django 中刪除和創建

在基于 Django 类的通用视图 CreateView 中设置表单字段

Django:使用slug而不是pk访问通用UpdateView

国际化基于Django类的通用视图(CreateView)?

Django的。如何设置默认选项使用通用CreateView

具有OnetoOne字段的Django CreateView / UpdateView(取决于记录是否存在)

Django如何在单个modelForm中排除字段,仅用于updateview而不是createview?

Django中UpdateView上的日期格式更改

将ImageField保存在UpdateView Django中