django表如何检测表是不是为空

Posted

技术标签:

【中文标题】django表如何检测表是不是为空【英文标题】:django tables how to detect if table is emptydjango表如何检测表是否为空 【发布时间】:2017-08-03 10:00:53 【问题描述】:

我是 django 和 Web 开发的新手,基于 SO 上的示例和帮助,我拼凑了一些东西,它采用模型并将其呈现在 django 表中。我的模板代码基本如下:

% block content %
% load static %
% load render_table from django_tables2 %
 <div class="function-page">
     <div class="table-form">
        <div class="function-container">
                % render_table reviews %
        </div>
     </div>
 </div>
% endblock %

视图如下:

@login_required(login_url="login/")
def review(request):
    table = DummyTable(DummyModel.objects.all())
    form = DummyForm()
    RequestConfig(request, paginate="per_page": 10).configure(table)
    return render(request, 'review.html', 'reviews': table, 'DummyForm': form)

这很好用。但是,我想做的是向用户显示一条消息,说当数据库表为空时没有记录。在当前设置中,它显示了一个带有列的空表,从可用性的角度来看,这可能不是最好的。

【问题讨论】:

【参考方案1】:

Milano 的回答对我有用,但从 if 条件中删除了“.list”:

% if reviews_table.data.list %
    % render_table reviews_table %
% else %
    <h1>There are no reviews yet</h1>
% endif %

【讨论】:

【参考方案2】:

针对table.paginated_rows 进行测试,当表没有数据时,它将为空并评估为False

他们在django_tables2/templates/django_tables2/bootstrap.html:~26 模板中使用它:

% for row in table.paginated_rows %
    ...
% empty %
    ...  table.empty_text 
% endfor %

【讨论】:

【参考方案3】:

有两种选择。要么在class Meta 中设置empty_text

class Reviews(tables.Table):

    class Meta:
        empty_text = _("There are no reviews yet")

或者你可以在模板里面检查一下,避免这样渲染表格

% if reviews_table.data.list %
    % render_table reviews_table %
% else %
    <h1>There are no reviews yet</h1>
% endif %

【讨论】:

【参考方案4】:

可能最简单的方法是在您的模板中。假设您的空变量名为reviews

% block content %
% load static %
% if reviews % 
   % load render_table from django_tables2 %
      <div class="function-page">
         <div class="table-form">
            <div class="function-container">
                % render_table reviews %
           </div>
         </div>
       </div>
% else % 
<span> Whatever holding response/error message you want. </span> 
% endif %
% endblock %

根据this answer, for example,对有效但为空的变量使用 % if variable %,它通常评估为 False,让您使用 % if reviews %。

但是,如果您需要真正的防弹检查,您可以执行 value|default:"nothing" - 来自here.

您也可以在视图中执行此操作,并使用 Django 中包含的 standard Messages framework 将错误消息传递回模板:

from django.contrib import messages
messages.add_message(request, messages.INFO, "No reviews found, I'm afraid!.")

您需要在模板中包含这样的内容才能使用消息:

% if messages %
<ul class="messages">
    % for message in messages %
    <li% if message.tags % class=" message.tags "% endif %> message </li>
    % endfor %
</ul>
% endif %

或者你可以两者都做! :)

【讨论】:

根据我对另一个答案的评论,我认为评论表始终是一个有效变量。有没有办法检查是否为空? 对一个有效但为空的变量使用 % if variable %,它通常评估为 False,ime(请参阅 this answer, for example。但是,如果您需要真正的防弹检查,您可以执行 @987654331 @ - 来自here. 好的,当记录数为 0 并且有效时,我在视图中明确将其设置为 None。 太棒了!我冒着风险,上面代码中未包含的 DummyTable 对象正在生成模板正在读取的 something ,因此不会在该 % if% 语句中评估 False 。很高兴你有一些有用的东西。 :) 是的,这可能是因为它是一个可能导致问题的 django-tables 实例;)感谢您的帮助。【参考方案5】:

这样做:

% if reviews %
<div class="function-page">
    <div class="table-form">
       <div class="function-container">
           % render_table reviews %
       </div>
    </div>
</div>

% else %
<div>
    <p> Message to use </p>
</div>

% endif %

【讨论】:

我认为reviews 表始终是一个有效的变量。有没有办法检查是否为空? 如果为空则不执行if语句。

以上是关于django表如何检测表是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

Django,检测object.filter是不是返回0个对象

Excel VBA - 如何检测用户在工作表上选择整行并区分是不是选择了多行?

java 怎么检测MySQL表的存在

Django models文件模型变更注意事项(表结构的修改)

如何检测文件夹是不是为空(Windows 批处理文件)?

数据结构linux 内核的list