【问题标题】:Using modelformset_factory in a Django Class Based View在基于 Django 类的视图中使用 modelformset_factory
【发布时间】:2018-09-13 10:03:18
【问题描述】:

我正在构建一个视图,让我可以同时更新多个对象的多个字段。我正在使用 ModelFormSetmodelformset_factory 进行此操作。

模板将是一个表格,其对象名称位于字段左侧(见下图)。

我找到了this 示例,但我一直坚持如何实现基于类的视图和模板。

我的表单集

class BaseFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(BaseFormSet, self).__init__(*args, **kwargs)
        self.queryset = Reference.objects.filter(
            start__isnull=True)


ReferenceFormSet = modelformset_factory(
    Reference,
    fields=('start', 'end'),
    formset=BaseFormSet,
    extra=0)

我的观点

class ReferenceFormSetView(LoginRequiredMixin, SuperuserRequiredMixin, FormView):
    model = Reference
    form_class = ReferenceFormSet
    template_name = "references/references_form.html"

    def form_valid(self, form):
        for sub_form in form:
            if sub_form.has_changed():
                sub_form.save()

        return super(ReferenceFormSetView, self).form_valid(form)

我的模板

{% extends "base.html" %}
{% load crispy_forms_tags %}

{% block content %}
<div class="container">
    <h1>{{ headline }}</h1>
    <div class="row">
        <form action="" method="post">
            {% crispy form %}
            <div class="">
                <input type="submit" value="Submit" />
            </div>
        </form>
    </div>
</div>
{% endblock content %}

问题

  • 该视图与 form_class 中的 Formset 看起来有些奇怪。有没有更好的方法来处理这个?
  • 如何访问要在表单中显示的实例名称?

【问题讨论】:

    标签: django django-forms django-views formset


    【解决方案1】:

    我找到了一个使用名为 django-extra-views 的包的解决方案。

    有一个名为ModelFormSetView 的类正是我想要的。这是我的实现(简化)供其他人使用 -

    我的观点

    class ReferenceFormSetView(ModelFormSetView):
        model = Reference
        template_name = "references/references_form.html"
        fields = ['start', 'end']
        extra = 0
    
        def get_queryset(self):
            return self.model.objects.all()
    
        def get_success_url(self):
            return reverse('references:formset')
    
        def formset_valid(self, formset):
            """
            If the formset is valid redirect to the supplied URL
            """
            messages.success(self.request, "Updated")
            return HttpResponseRedirect(self.get_success_url())
    
        def formset_invalid(self, formset):
            """
            If the formset is invalid, re-render the context data with the
            data-filled formset and errors.
            """
            messages.error(self.request, "Error dummy")
            return self.render_to_response(self.get_context_data(formset=formset))
    

    我的模板

    <form class="" method="post">
        {% csrf_token %}
        {{ formset.management_form }}
        {% for form in formset %}
            <div class="">
                {% for field in form %}
                    {{ field }}
                {% endfor %}
            </div>
        {% endfor %}
        <button type="submit" class="btn btn-primary">Save</button>
    </form>
    

    【讨论】:

    • 感谢您对 django 软件包的建议。我希望它很快会在其测试套件中获得更多覆盖。
    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 2018-05-14
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多