在 Django DetailView 中获取表单
Getting a form in Django DetailView
我目前正在尝试显示一个自定义表单,我在相应视图中更改了表单
在.html
<form action="{% url 'systems_system_update' system.id %}" id="system_update_form" method="post" class="form">
{% csrf_token %}
{% buttons %}
<button type="submit" class="btn btn-primary">Update {{ system.name }}</button>
{% endbuttons %}
{% bootstrap_form system_update_form %}
{% buttons %}
<button type="submit" class="btn btn-primary">Update {{ system.name }}</button>
{% endbuttons %}
</form>
所以我试图显示 system_update_form 它在视图中定义的位置
在 SystemDetailView
class SystemDetailView(DetailView):
"""Detail view for Systems"""
form_class = SystemForm
model = System
template_name = 'systems/system_detail.html'
def get_form(self, form_class):
form = super(SystemDetailView, self).get_form(form_class)
form.fields['primary_purpose_business_use'].label = "Primary purpose/business use"
form.fields['secondary_purpose_business_uses'].label = "Secondary purpose/business uses"
return form
def get_context_data(self, **kwargs):
context = super(SystemDetailView, self).get_context_data(**kwargs)
context.update({
'system_update_form': self.form_class(instance=self.get_object()),
'object_name': self.object.name,
'user_can_edit': self.request.user.has_perm(
'services.change_system'),
'user_can_delete': self.request.user.has_perm(
'services.delete_system'),
'object_events': self.object.events.all(),
})
return context
因此,我正在更新上下文并将 'system_update_form' 设置为表单,我正在尝试使用 get_form 更新表单,但我认为 DetailView 没有 get_form 覆盖的方法。
在表单中更新它不是一个选项,因为 SystemForm 在许多不同的地方使用,需要专门针对此视图进行更改
DetailView
没有 get_form()
方法,因为它 不使用表格,因此您的 get_form()
方法未被调用。
相反,您可以在 get_form()
方法中手动实例化表单,并在生成 context
时调用此方法。
此外,在您的代码中,您通过调用 self.get_object()
将 instance
传递给表单。这将导致另一个获取 object
的查询,因为 Django 之前已经获取了 object
。您可以使用 self.object
.
直接传递 object
而不是那样做
class SystemDetailView(DetailView):
def get_form(self):
form = self.form_class(instance=self.object) # instantiate the form
# modify the form fields
form.fields['primary_purpose_business_use'].label = "Primary purpose/business use"
form.fields['secondary_purpose_business_uses'].label = "Secondary purpose/business uses"
return form
def get_context_data(self, **kwargs):
context = super(SystemDetailView, self).get_context_data(**kwargs)
context.update({
'system_update_form': self.get_form(), # get the form instance
'object_name': self.object.name,
'user_can_edit': self.request.user.has_perm(
'services.change_system'),
'user_can_delete': self.request.user.has_perm(
'services.delete_system'),
'object_events': self.object.events.all(),
})
return context
我目前正在尝试显示一个自定义表单,我在相应视图中更改了表单
在.html
<form action="{% url 'systems_system_update' system.id %}" id="system_update_form" method="post" class="form">
{% csrf_token %}
{% buttons %}
<button type="submit" class="btn btn-primary">Update {{ system.name }}</button>
{% endbuttons %}
{% bootstrap_form system_update_form %}
{% buttons %}
<button type="submit" class="btn btn-primary">Update {{ system.name }}</button>
{% endbuttons %}
</form>
所以我试图显示 system_update_form 它在视图中定义的位置 在 SystemDetailView
class SystemDetailView(DetailView):
"""Detail view for Systems"""
form_class = SystemForm
model = System
template_name = 'systems/system_detail.html'
def get_form(self, form_class):
form = super(SystemDetailView, self).get_form(form_class)
form.fields['primary_purpose_business_use'].label = "Primary purpose/business use"
form.fields['secondary_purpose_business_uses'].label = "Secondary purpose/business uses"
return form
def get_context_data(self, **kwargs):
context = super(SystemDetailView, self).get_context_data(**kwargs)
context.update({
'system_update_form': self.form_class(instance=self.get_object()),
'object_name': self.object.name,
'user_can_edit': self.request.user.has_perm(
'services.change_system'),
'user_can_delete': self.request.user.has_perm(
'services.delete_system'),
'object_events': self.object.events.all(),
})
return context
因此,我正在更新上下文并将 'system_update_form' 设置为表单,我正在尝试使用 get_form 更新表单,但我认为 DetailView 没有 get_form 覆盖的方法。 在表单中更新它不是一个选项,因为 SystemForm 在许多不同的地方使用,需要专门针对此视图进行更改
DetailView
没有 get_form()
方法,因为它 不使用表格,因此您的 get_form()
方法未被调用。
相反,您可以在 get_form()
方法中手动实例化表单,并在生成 context
时调用此方法。
此外,在您的代码中,您通过调用 self.get_object()
将 instance
传递给表单。这将导致另一个获取 object
的查询,因为 Django 之前已经获取了 object
。您可以使用 self.object
.
object
而不是那样做
class SystemDetailView(DetailView):
def get_form(self):
form = self.form_class(instance=self.object) # instantiate the form
# modify the form fields
form.fields['primary_purpose_business_use'].label = "Primary purpose/business use"
form.fields['secondary_purpose_business_uses'].label = "Secondary purpose/business uses"
return form
def get_context_data(self, **kwargs):
context = super(SystemDetailView, self).get_context_data(**kwargs)
context.update({
'system_update_form': self.get_form(), # get the form instance
'object_name': self.object.name,
'user_can_edit': self.request.user.has_perm(
'services.change_system'),
'user_can_delete': self.request.user.has_perm(
'services.delete_system'),
'object_events': self.object.events.all(),
})
return context