如何在内联形式中使用“django-autocomplete-light”

Posted

技术标签:

【中文标题】如何在内联形式中使用“django-autocomplete-light”【英文标题】:How to use "django-autocomplete-light" in inline form 【发布时间】:2018-06-13 06:29:33 【问题描述】:

我想使用带有“django-autocomplete-light 字段”的内联模型表单。我也有点绝望,因为我不太了解“javascript”。 这是我的表格的图片。乍一看,它按预期工作:

不幸的是,只有第一个字段正确加载。如果我添加更多字段,则会出现错误(参见图片)。

这是我怀疑错误的表单模板,因为第一个字段可以正常工作。

<div class="container">
<form method="post" action="">
  % csrf_token %
   form.as_p 

  <!-- Medication Table -->
  <table class="table">
       medication.management_form 

      % for form in medication.forms %
          % if forloop.first %
              <thead>
              <tr>
                  % for field in form.visible_fields %
                      <th> field.label|capfirst </th>
                  % endfor %
              </tr>
              </thead>
          % endif %
          <tr class="% cycle "row1" "row2" % formset_row">
              % for field in form.visible_fields %
                  <td>
                      # Include the hidden fields in the form #
                      % if forloop.first %
                          % for hidden in form.hidden_fields %
                               hidden 
                          % endfor %
                      % endif %
                       field.errors.as_ul 
                       field 
                  </td>
              % endfor %
          </tr>
      % endfor %
  </table>



  <input type="submit" value="Submit Form"/>


  <script type="text/javascript" src="% static '/js/core/jquery.3.2.1.min.js' %"></script>
   form.media 

    <!-- script for add, delete, update -->

    <script src="% static 'formset/jquery.formset.js' %"></script>
    <script type="text/javascript">
        $('.formset_row').formset(
            addText: 'add medication',
            deleteText: 'remove',
            prefix: 'medication_set'
        );
    </script>


</div>

【问题讨论】:

我真的不在乎我用什么包来解决问题。以内联形式进行有效搜索很重要。我的问题基本上是我想创建一个与药物有一对多联系的案例,而这些药物又在数千种活性成分的数据库中具有活性成分。在这里,我必须有一个舒适的搜索。非常感谢您能帮我解决这个问题。 我已经回答了这个问题的副本here。我相信这个问题与 formset.media 被包含在表单集之后而不是之前有关。我不确定这是为什么,但我注意到将它移到表单集的开始标记之前解决了我遇到的问题。 django-autocomplete-light version 3.8.1 为我工作。您可以在此处阅读发行说明:yourlabs.org/posts/…。 【参考方案1】:

经过几个小时的谷歌搜索和其他答案,对我有用的是这个。 我在 jquery.formset.js 的默认值中添加了一个名为 clone 的键,默认值为 true。

    /* Setup plugin defaults */
    $.fn.formset.defaults = 
        prefix: 'form',                  // The form prefix for your django formset
        formTemplate: null,              // The jQuery selection cloned to generate new form instances
        clone: true,                     // Set this value to false when using autocomplete in formset
        addText: 'add another',          // Text for the add link
        deleteText: 'remove',            // Text for the delete link
        addCssClass: 'add-row',          // CSS class applied to the add link
        deleteCssClass: 'delete-row',    // CSS class applied to the delete link
        formCssClass: 'dynamic-form',    // CSS class applied to each form in a formset
        extraClasses: [],                // Additional CSS classes, which will be applied to each form in turn
        keepFieldValues: '',             // jQuery selector for fields whose values should be kept when the form is cloned
        added: null,                     // Function called each time a new form is added
        removed: null                    // Function called each time a form is deleted
    ;

然后将jquery.formset.js中addButton.click()里面的代码替换为

row = options.formTemplate.clone(true).removeClass('formset-custom-template')

row = options.formTemplate.clone(options.clone).removeClass('formset-custom-template')

然后在formset的模板中,从这里改变了formset函数:

$('#brand_formset_div .parentdiv .form-group').formset(
                prefix: ' brand_formset.prefix ',
                deleteText: 'Clear',
                deleteCssClass: 'shop-now-delete',
                addText: 'Add new Brand',
                addCssClass: 'btn btn-success ',
            );

为此(一个克隆键为 false 与函数 added 一起插入,该函数在插入新行时触发。该函数隐藏额外的自动完成框。)

$('#brand_formset_div .parentdiv .form-group').formset(
                prefix: ' brand_formset.prefix ',
                clone: false,
                deleteText: 'Clear',
                deleteCssClass: 'shop-now-delete',
                addText: 'Add new Brand',
                addCssClass: 'btn btn-success ',
                added: function(row) 
                    $('span .select2-selection--single:odd', row || null).css("display", "none");
                
            );

这对我来说很好。

【讨论】:

以上是关于如何在内联形式中使用“django-autocomplete-light”的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在内联 Bootstrap Datepicker 上使用 setDate?

在内联样式中使用角度变量

在内联元素中的块元素会自动换行..求解答~谢谢~

在内联 ptx 汇编 CUDA 中使用 SIMD 视频指令

在内联表单集中使用 Django FileField

无法让社交媒体共享按钮在内联列表中排队