我试图创建一个相当简单的表单,允许我从数据库更新和删除工具。一切都在工作,除了HTML渲染,为此,我使用django-crispy-forms。
如果我想要的只是一个提交按钮,以下代码非常有效:
forms.py
class InstrumentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(InstrumentForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
# Add a submit button after all of my fields are auto generated in the form.
self.helper.add_input(Submit('submit', 'Submit'))
class Meta:
model = Instrument
views.py
class InstrumentDetailView(generic.UpdateView):
template_name = 'instrument/details.html'
form_class = InstrumentForm
# FIXME Don't hardcode the URL
success_url = '/inventory/instruments'
model = Instrument
仪器/ details.html
{% extends "shared/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<h1>Instrument Details</h1>
{% crispy form %}
{% endblock %}
通过这种配置,我看到我的Instrument模型中的所有字段都完美呈现,并且提交按钮有效。
问题是我想渲染一个&#34;删除&#34;链接旁边的提交按钮。我尝试过以下方法:
forms.py
class InstrumentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(InstrumentForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
# Add a submit button after all of my fields are auto generated in the form.
self.helper.add_input(Submit('submit', 'Submit'))
self.helper.add_input(HTML('<a href=foo>foo</a>'))
class Meta:
model = Instrument
但这只是呈现一个如下所示的按钮:
<input name="" value="" class="" id="-id-" type="">
所以看起来add_input
仅适用于按钮。然后我尝试了以下内容:
forms.py
class InstrumentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(InstrumentForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
button_layout = Layout(
ButtonHolder(
Submit('submit', 'Submit'),
HTML('<a href="foo">foo</a>')
),
)
self.helper.add_layout(button_layout)
class Meta:
model = Instrument
这确实实际上呈现了我的按钮和链接,但所有其他字段都消失了。我当然可以通过手动指定InstrumentForm类中的所有字段来解决这个问题,但我希望避免代码重复。
是否有人知道使用django-crispy-form 仅追加提交按钮和任意链接到自动生成表单底部的方法?我错过了什么?
答案 0 :(得分:1)
这是我最终在我的forms.py
文件中使用Twitter bootstrap进行此操作的内容:
class InstrumentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(InstrumentForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.add_input(Submit('submit', 'Submit'))
self.helper.add_input(Button('delete', 'Delete', onclick='window.location.href="{}"'.format('delete')))
class Meta:
model = Instrument
现在,“删除”按钮位于“提交”按钮旁边,我不必明确定义任何其他表单字段。提交按钮有效,当我点击项目#1的删除按钮时,我被发送到以下URL:
http://foo/inventory/instruments/1/delete
答案 1 :(得分:0)
我的表单代码:
class PersonForm(forms.ModelForm):
class Meta:
model = Person
fields = ('name', 'email', 'job_title', 'bio')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.add_input(Submit('submit', 'Save person'))
if kwargs['instance']:
self.helper.add_input(Button('delete', 'Delete', onclick='window.location.href="{}"'.format('../delete')))
我的urls.py包含:
path('<int:pk>/delete/', views.PersonDeleteView.as_view(), name='person_delete')