【发布时间】:2018-01-06 18:04:50
【问题描述】:
我有以下基于类的视图,
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 页面。 (使用默认小部件意味着布局完全错误,因为我们想要嵌套布局)
该表单有效,但是缺少的一件事是根据正在编辑的实例预先填充复选框。 表单中的所有字段都显示为空,迫使用户在编辑过程中重写所有数据。
当我使用基于函数的视图时,我必须在视图中定义一个“实例”,然后它会加载所有相关数据。然而,我无法为我目前正在研究的基于类的视图创建一些类似的东西。
有谁知道如何解决这个问题?
编辑:
我已经包含了我在下面的表单中使用的 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:
基于一些 cmets(谢谢!)我已经像这样编辑了视图的 '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
当我将它打印到终端时,值似乎出现了,但我仍然不清楚如何将它传递给实际模板。如果我遗漏了一些非常明显的东西,我很抱歉,我仍然需要了解基于类的视图。
【问题讨论】:
-
如果您使用“自定义 HTML 页面”来显示您的复选框,大概您需要在此处执行一些操作来填充它们?也许你应该展示那个模板......
-
好电话,我已经编辑了我的帖子以包含我用于表单的 HTML 页面。
-
您没有使用表单在模板中显示任何内容,因此您必须确保您的上下文中填充了正确的数据。在您的情况下,无论是在 get 请求中还是在 post 请求中,您都需要将 facet_links(或 get_object 返回的对象)添加到上下文以呈现模板。
-
顺便说一句,即使不使用表单字段提供的小部件,我仍然会使用表单数据来填充模板。您仍然可以使用
form.facet_links.id_for_label和form.facet_links.values等内容... -
你能给我举个例子吗?我已将相关值添加到 GET、POST 和 Get_Context 函数中,但视图仍然没有传递相关变量。
标签: django django-forms django-class-based-views