Django - 使用实例数据预填充表单

Django - Pre populate form with instance data

我有以下基于 class 的视图,

class FacetUpdate(TenantRootedMixin, UpdateView):
  model = Tenant
  context_object_name = 'facetten'
  form_class = FacetForm

  def get_success_url(self):
      kwargs = {'uuid': self.object.uuid}
      return reverse_lazy('productupdate', kwargs=kwargs)


  def get_success_url(self, **kwargs):
      return reverse('facet_list', args=[self.request.tenant.slug])


  def get(self, request, *args, **kwargs):
      d = super(FacetUpdate, self).post(request, *args, **kwargs)
      self.object = self.get_object()
      return super(FacetUpdate, self).get(request, *args, **kwargs)


  def post(self, request, *args, **kwargs):
      d = super(FacetUpdate, self).post(request, *args, **kwargs)
      self.object = self.get_object()
      #Create list of selected checkbox_ids
      hitlist = request.POST.getlist('facet_link')
      #Get current tenant
      currenttenant = Tenant.objects.get(name=self.request.tenant)
      #Get all facets that have been selected in the form
      selected_facets = Facetss.objects.filter(id__in=hitlist)
      #Update the currenttenant
      currenttenant.linked_facets = selected_facets
      currenttenant.save()
      return d

将数据传递给以下表格。

class FacetForm(forms.ModelForm):


  class Meta:
      model = Tenant
      fields = ['linked_facets']

此表单未使用自动生成的表单,而是使用包含复选框列表的自定义 html 页面。 (使用默认小部件意味着布局完全错误,因为我们想要嵌套布局)

表单有效,但是,缺少的一件事是根据正在编辑的实例预先填充复选框。 表单中的所有字段都显示为空,迫使用户在编辑过程中重写所有数据。

当我使用基于函数的视图时,我必须在视图中定义一个 'instance',然后它将加载所有相关数据。然而,我无法为我目前正在处理的基于 class 的视图创建类似的东西。

有谁知道如何解决这个问题?

编辑:

我在下面的表格中添加了 html 页面

 {% extends "layouts/tabbed_panel.html" %}
{% load i18n %}
{% load mptt_tags %}

{% block panel-header %}
    <h1 class="text-primary">Facetten Aanpassen</h1>
{% endblock %}


{% block panel-body %}
<form action="." method="POST" class="FacetForm">{% csrf_token %}
        <ul id="id_linked_facets">
        {% recursetree facetten %}
            <li>
                <label><input type="checkbox" name= 'facet_link' value={{node.pk}}><strong>{{ node.name }}</strong></label>



                {% if not node.is_leaf_node %}
                    <ul class="children">
                        {{ children }}
                    </ul>



                {% endif %}
            </li>
        {% endrecursetree %}
        </ul>
        <br>
        <div class="text-right">
            <a href="{% url 'facet_list' tenant.slug %}" class="btn btn-default">{% block cancel-button-text %}{% trans "Cancel" %}{% endblock %}</a>
            <input type="submit" class="btn btn-primary" value="{% trans 'Save' %}" />
        </div>
</form>

{% endblock %}

编辑 2:

根据一些评论(谢谢!)我已经像这样编辑了视图的 'GET' 函数。

    def get(self, request, *args, **kwargs):
      d = super(FacetUpdate, self).post(request, *args, **kwargs)
      currenttenant = self.context.tenant
      d['linked_facets'] = currenttenant.linked_facets
      self.object = self.get_object()
      return d

当我将它打印到终端时,值似乎显示出来了,但我仍然不清楚如何将它传递给实际模板。很抱歉,如果我遗漏了一些非常明显的东西,我仍然需要了解基于 class 的观点。

感谢大家的回复! (尤其是 dirkgroten) 我使用 MPTT 模块的事实使一切变得更加复杂,但在您的帮助下,我通过进行 2 处更改解决了问题:

在视图中我添加了一个 get_context_data:

def get_context_data(self, **kwargs):
    d = super(FacetUpdate, self).get_context_data(**kwargs)
    currenttenant = self.context.tenant
    d['linked_facets'] = currenttenant.linked_facets.all()
    print("CONTEXT", d)
    return d

然后我使用模板中的 'linked_facets' 值来检查是否应该选中该框(根据 dirkgroten 他的建议略有更改)

<label><input type="checkbox" name= 'facet_link' {% if node in linked_facets %}checked{%endif%} value={{node.pk}}><strong>{{ node.name }}</strong></label>

非常感谢大家,这个问题困扰了我几个小时,终于解决了!