不能只是删除一个删除按钮到一个脆弱的形式

时间:2014-12-04 15:49:42

标签: django django-forms django-crispy-forms

我试图创建一个相当简单的表单,允许我从数据库更新和删除工具。一切都在工作,除了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 仅追加提交按钮和任意链接到自动生成表单底部的方法?我错过了什么?

2 个答案:

答案 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')