【问题标题】:Django-datatable-view X-editable internal server errorDjango-datatable-view X-editable 内部服务器错误
【发布时间】:2017-06-18 10:40:10
【问题描述】:

我已经为此苦苦挣扎了几天。 我想使用 django-datatable-view 的 xeditable 列集成。我的代码正确加载了数据表 (see here),但是每当我指定 make_xeditable 的列时,我都会收到 500 Internal Server 错误。我查看了讨论 django-datatable-view 的几页(由于没有足够的代表而无法发布链接...),但没有一个讨论 x-editable 选项。

使用在线现场演示 (here)(0.7 版)中的 sn-ps 无济于事。表格已加载,但列不可编辑。

class PriceListDataTableView(XEditableDatatableView):
    model = PriceList
    datatable_options = {
        'columns': [
            'id',
            'date',
            'product',
            'unit',
            ("Price", 'price', helpers.make_xeditable),
        ]
}

我在本地主机上运行了最新版本 (0.9),他们的示例有效!但我无法让它在我自己的应用程序中工作。两种设置都运行 django 1.8

这是我的模型:

class PriceList(models.Model):

    # Fields
    date =    models.DateField(verbose_name="Price list date")
    product = models.CharField(verbose_name="Product name", max_length=100)
    unit =    models.CharField(verbose_name="Unit", max_length=6)
    price =   models.DecimalField(verbose_name="Price", decimal_places=2, 
              max_digits=10)

这是我的模板:

{% extends "agrichem/base.html" %}
{% block content %}

<script>
$(document).ready(function() {
    <!-- Initialization for x-editable tables -->
    $.fn.editable.defaults.mode = 'inline';
    $(function(){
        var xeditable_options = {};
        datatableview.initialize($('.datatable'), {
               fnRowCallback: datatableview.make_xeditable(xeditable_options),
        });

    });
});
</script>

{{ datatable }}

{% endblock %}

这是我的看法:

class PriceListDataTableView(XEditableDatatableView):
    model = PriceList

    class datatable_class(Datatable):
        class Meta:
            columns = ['id', 'date', 'product', 'unit', 'price']
            processors = {
                'price': helpers.make_xeditable,

            }

如果我删除 processors 块,我的表格会加载,但不可编辑。有了它,我会弹出一个窗口,上面写着:

DataTables 警告:表 id=DataTables_Table_0 - Ajax 错误。有关此错误的更多信息,请参阅 datatables.net/tn/7

只要服务器没有返回 2xx 代码,就会发送此弹出错误,因此它基本上是由于以下原因而发生的:

在控制台中我收到 500 内部服务器错误(链接计数被破坏):

jquery.min.js:4 GET ht__tp://127.0.0.1:8000/pricelist/?draw=1&columns%5B0%5D%5Bdata%5D=0&columns%art=0&length=25&search%5Bvalue%5D=&search% 5Bregex%5D=false&_=1497779941842 500(内部服务器错误)

我现在正在兜圈子,我需要一些帮助。有人搞定了吗?

编辑: 我现在已经将 django-datatable-view 降级到 0.8 版,并使用了下面建议的语法,我也得到了 SAME 500 Internal Server 错误。我怀疑我在某处遗漏了一些必要的设置步骤,但文档并没有说明什么。

【问题讨论】:

    标签: django datatables x-editable


    【解决方案1】:

    试试

    class PriceListDataTableView(XEditableDatatableView):
        model = PriceList
        datatable_options = {
            'columns': [
                'id',
                ("Price", 'price', helpers.make_xeditable),
                ...
            ]
        }
    

    编辑:您还需要页面级初始化:

    // Page javascript
    datatableview.auto_initialize = false;
    $(function(){
        var xeditable_options = {};
        datatableview.initialize($('.datatable'), {
            fnRowCallback: datatableview.make_xeditable(xeditable_options),
        });
    })
    

    编辑:模板中缺少 csrf 令牌,转载如下:

    {% extends "agrichem/base.html" %}
    {% block content %}
    
    <script>
    $(document).ready(function() {
        <!-- Initialization for x-editable tables -->
        $.fn.editable.defaults.mode = 'inline';
        $(function(){
            var xeditable_options = {};
            datatableview.initialize($('.datatable'), {
               fnRowCallback: datatableview.make_xeditable(xeditable_options),
            });
    
        });
    });
    </script>
    

    线是

    {% csrf_token %}
    

    {{ 数据表 }}

    {% 端块 %}

    【讨论】:

    • 我已经尝试过,如上所述我的问题。表格已加载,但列不可编辑。
    • 糟糕:忘记了页面初始化。请参阅上面的编辑。
    • 你在使用 csrf-token 吗?
    • 我编辑了我的答案。已知 x-editable 在没有 csrf 令牌的情况下会失败。
    • 添加了 csrf 令牌,没有运气。此时我不再收到 500 错误,但我也没有收到可编辑的列。我怀疑我在版本地狱......有些东西不匹配。我想我会从头开始再试一次。
    【解决方案2】:

    在经历了很多挫折之后,我放弃了 django-datatable-view。我无法让它用于内联编辑,这是我的主要要求。

    然后我找到了django-inplaceedit。它很有魅力,是我需要的一切。

    我在模板中呈现我的表格,如下所示:

    {% extends "site_base.html" %}
    
    
    {% block more_extra_script %}
    
        {% load inplace_edit %}
        {% inplace_css 0 %}
        {% inplace_js 1 0 %}
    
    {% endblock more_extra_script %}
    
    
    {% block content %}
    
    <div class="container-fluid">
        <p><a class="btn btn-default" href="{% url 'pricelist_list' %}">PriceList Listing</a></p>
    
        <h2>Pricelist for {{ pricelist_date }}</h2>
        <p>Double-click a price to edit it</p>
    
        <table class="table table-responsive table-striped .table-bordered .table_hover">
          <thead class="info">
              <th>Product</th>
              <th>Unit</th>
              <th>Price</th>
          </thead>
          <tbody>
              {% for prod in products %}
                  <tr>
                      <td>{{prod.product}}</td>
                      <td>{{prod.unit}}</td>
                      <td>{% inplace_edit "prod.price" %}</td>
                  </tr>
              {% endfor %}
          </tbody>
        </table>
    
    </div>
    {% endblock %} 
    

    这个应用程序的美妙之处在于它透明地处理所有服务器端的东西。您双击该字段,更改它,按 Enter,然后数据库中的值将更新。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2011-03-18
      • 2015-06-25
      • 2018-11-23
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      相关资源
      最近更新 更多