27👍
As you are including the form tags, csrf token and submit button in the template yourself, you should use the crispy filter instead of the crispy tag.
<form action="." method="post">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" value="Submit" class="btn btn-success">
</form>
If you want to use the tag, then you can define your submit button inside a FormHelper
. See the crispy tag docs for more info.
14👍
For others who get stuck here using the tag and wanting to add some custom html to their <form>
…
You can add the self.helper.form_tag = False
property to your helper and it won’t append a </form>
to the end of your form.
More docs here.
- Is it possible to serve a static html page at the root of a django project?
- Celery immediately exceeds memory on Heroku
8👍
To add the submit button to your form, crispy_form’s documentation did it this way:
import floppyforms.__future__ as forms # you can use django's own ModelForm here
from crispy_forms.helper import FormHelper
from django.core.urlresolvers import reverse_lazy
class YourForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(YourForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = 'post' # this line sets your form's method to post
self.helper.form_action = reverse_lazy('your_post_url') # this line sets the form action
self.helper.layout = Layout( # the order of the items in this layout is important
'field1_of_your_model', # field1 will appear first in HTML
'field2_of_your_model', # field2 will appear second in HTML
# this is how to add the submit button to your form and since it is the last item in this tuple, it will be rendered last in the HTML
Submit('submit', u'Submit', css_class='btn btn-success'),
)
class Meta:
model = YourModel
Then, in your template, all you have to do is this
{% load crispy_forms_tags %}
{% crispy form %}
And that’s it. There is no need to write ANY html in your template.
I think the whole point of crispy_forms is to define HTML in Python. So that you don’t have to write much HTML in your template.
Some additional notes:
Since you are using bootstrap. There are three more fields that will be helpful to you, inside __init__()
defined above, add these if you need them:
self.helper.form_class = 'form-horizontal' # if you want to have a horizontally layout form
self.helper.label_class = 'col-md-3' # this css class attribute will be added to all of the labels in your form. For instance, the "Username: " label will have 'col-md-3'
self.helper.field_class = 'col-md-9' # this css class attribute will be added to all of the input fields in your form. For isntance, the input text box for "Username" will have 'col-md-9'
- Overriding Django's RelatedManager methods
- How to annotate Django view's methods?
- Using Django Admin Actions to send bulk emails
- What is the correct way to deal with DB migration while using South, Django and Git?