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>
非常感谢大家,这个问题困扰了我几个小时,终于解决了!
我有以下基于 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>
非常感谢大家,这个问题困扰了我几个小时,终于解决了!