如何使用django-crispy-forms覆盖提交按钮的默认类属性?
Django-Crispy-Forms + Bootstrap5:替换提交按钮默认CSS类的问题
我在学习使用django-crispy-forms搭配Bootstrap5时遇到一个问题,表单代码如下:
class CommentForm(forms.ModelForm): class Meta : model = Comments fields = ["comment_content"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.helper = FormHelper() self.helper.form_show_labels = False self.fields['comment_content'].widget.attrs['placeholder'] = 'comment here...' self.helper.layout = Layout( "comment_content", ) self.helper.layout.append(Submit("post_comment", "Post comment",css_class="btn btn-outline-primary"))
问题在于最后一行设置css_class后,生成的HTML里默认类btn btn-primary没有被替换,而是被追加到后面:
<input type="submit" name="post_comment" value="Post comment" class="btn btn-primary btn-outline-primary" id="submit-id-post_comment">
我需要最终生成的类为btn btn-outline-primary,而非两者叠加。
解决方案
要完全替换默认的CSS类,不要使用css_class参数,改用attrs直接设置class属性,这样会覆盖组件的默认类:
修改最后一行代码为:
self.helper.layout.append(Submit("post_comment", "Post comment", attrs={'class': 'btn btn-outline-primary'}))
原理:django-crispy-forms的Bootstrap5模板会给Submit按钮默认添加btn btn-primary类,css_class参数的作用是追加额外类,而attrs中的class会直接覆盖掉默认的类属性,从而得到你想要的结果。
内容的提问来源于stack exchange,提问作者WalterBlack1
相关产品推荐
相关产品推荐

