You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Crispy Form中jQuery控制提交按钮显示功能失效求助

问题:Django Crispy Form提交按钮未按预期显示

我创建了一个Django Crispy Form,希望所有字段填写完成后才显示提交按钮。用jQuery实现后,填完所有字段提交按钮还是不显示,求解决。

表单状态说明

  • 未使用jQuery隐藏提交按钮:表单显示所有输入字段和底部的提交按钮
  • 使用jQuery后:所有字段填写完毕,但提交按钮依然隐藏

相关代码

forms.py

class AppForm(forms.ModelForm):
    
    class Meta:
        model = App
        fields = ('__all__')

    def __init__(self, *args, **kwargs):
        super(AppForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = False

        defualt_image_path = '/media/photo.png'
        self.fields['appicon'].widget.attrs['placeholder'] = defualt_image_path
        self.fields['appicon'].widget.attrs['classs']= 'appicon-field'
        self.fields['appname'].widget.attrs.update({'placeholder': 'Apps Name', 'class':'appname-field'})
        self.fields['link'].widget.attrs.update({'placeholder':'App Link','class':'link-field'})
        self.fields['category'].widget.attrs.update({'placeholder':'App Category', 'class': 'catg-field'})
        self.fields['subcategory'].widget.attrs.update({'placeholder':'Sub Category', 'class': 'subcatg-field'})
        self.fields['points'].widget.attrs.update({'placeholder':'ADD POINTS', 'class': 'points-field'})

JavaScript代码

$(document).ready(function() {
  // Function to check if all fields are filled
  function checkFields() {
    var imageInput = $('.appicon-field')[0].files.length > 0;
    var charInput1 = $('.appname-field').val().trim() !== '';
    var charInput2 = $('.link-field').val().trim() !== '';
    var charInput3 = $('.catg-field').val().trim() !== '';
    var charInput4 = $('.subcatg-field').val().trim() !== '';
    var charInput5 = $('.points-field').val().trim() !== '';

    // Show/hide submit button based on input status
    document.querySelector('.submitform-button').style.display = imageInput && charInput1 && charInput2 && charInput3 && charInput4 && charInput5 ? 'inline-block' : 'none';
  }

  // Trigger checkFields on input change
  $('.appicon-field, .appname-field, .link field, .catg-field, .subcatg-field, .points-field').on('change', function() {
    checkFields();
  });

  // Initial check on page load
  checkFields();
});

CSS代码

.submitform-button {
  display: none;
  padding: 10px 75px;
  cursor: pointer;
  font-weight: bold;
  text-align: center;
  text-decoration: none;
  background-color: #f3c19d;
  color: #293845;
  border: 2px solid #ec975b;
}

HTML代码

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>

<div class="submit-div">
  <button type="submit" class="submitform-button" id="submitform-button">Submit</button>
</div>

问题排查与修复方案

1. 修复字段类名拼写错误

在forms.py中,appicon字段的类名写成了classs(多了一个s),导致jQuery无法选中该字段:

# 错误写法
self.fields['appicon'].widget.attrs['classs']= 'appicon-field'
# 正确写法
self.fields['appicon'].widget.attrs['class']= 'appicon-field'

2. 修正jQuery选择器错误

JavaScript中监听事件的选择器里,.link field是错误的,应该是.link-field:

// 错误写法
$('.appicon-field, .appname-field, .link field, .catg-field, .subcatg-field, .points-field').on('change', function() {
// 正确写法
$('.appicon-field, .appname-field, .link-field, .catg-field, .subcatg-field, .points-field').on('input change', function() {

3. 更换事件类型提升体验

change事件只有在输入框失去焦点时才触发,换成input事件可以实时检测输入变化,同时保留change事件兼容文件选择(文件选择用input事件可能不生效)。

4. 优化字段检查逻辑(可选)

可以简化检查逻辑,避免逐个字段判断:

function checkFields() {
  // 检查文本输入字段
  const textFieldsFilled = $('.appname-field, .link-field, .catg-field, .subcatg-field, .points-field').toArray().every(field => field.value.trim() !== '');
  // 检查文件字段
  const fileFieldFilled = $('.appicon-field')[0].files.length > 0;
  
  $('.submitform-button').toggle(textFieldsFilled && fileFieldFilled);
}

修复后的完整JavaScript代码

$(document).ready(function() {
  function checkFields() {
    const textFieldsFilled = $('.appname-field, .link-field, .catg-field, .subcatg-field, .points-field').toArray().every(field => field.value.trim() !== '');
    const fileFieldFilled = $('.appicon-field')[0].files.length > 0;
    
    $('.submitform-button').toggle(textFieldsFilled && fileFieldFilled);
  }

  $('.appicon-field, .appname-field, .link-field, .catg-field, .subcatg-field, .points-field').on('input change', checkFields);

  checkFields();
});

内容的提问来源于stack exchange,提问作者rohit10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:17:03