在 django 模板中的数据表示之间切换

Posted

技术标签:

【中文标题】在 django 模板中的数据表示之间切换【英文标题】:Switch between data presentation in template of django 【发布时间】:2017-08-02 11:00:14 【问题描述】:

我是 Django 新手。 我不知道我问的东西是否在纯 django tempates 中可用。

我有从数据库加载数据的应用程序主页。 它在div 中输出信息,然后使用引导程序以获得更好的外观。 在那个 div 中,我有 Image 和 Title。

有没有办法让用户能够在views 之间切换,以便他们可以选择是否喜欢div 或例如table 仅带有标题?

我知道基于 ajax 的框架有类似的东西,但从未使用过。

我还想在切换视图时保留模型中的数据,因为我不想在切换视图时向 db 询问数据。

有可能吗?或者唯一的方法是制作单独的模板并为 /view/ 添加route 所以我将用户重定向到具有不同模板的不同页面并将查看处理为新页面(使用重新加载模型)

【问题讨论】:

【参考方案1】:

我不确定这是一个好习惯,但如果你真的希望它在同一个 html 文件中:

使用 Django 模板语言来评估用户想要的“视图”。

修改您的 html 文件以将其包含在正文中。 首先我们制作一个表单,询问用户他想要什么视图,然后我们使用上下文字典中的数据进行评估

<form role="form" id="view_form" method="post" action="<same url>">
        <input type="radio" name="view" value="view1" checked> View #1 <br> <!-- this one will be checked by default -->
        <input type="radio" name="view" value="view2"> View #2 <br>
        <input type="radio" name="view" value="view3"> View #3 <br>
        <button type="submit" name="submit">Change View</button>
    </form>

    % if view == view1  %
        <!-- your code here -->
    % elif view == view2 %    
        <!-- your code here -->
    % endif %

在views.py 中修改您的视图以捕获表单中的数据并将其添加到上下文字典中。

def page(request):
    context_dict = 
    if request.method=='POST':
        view = request.POST.get['view']
        context_dict['view'] = str(view)

    #The rest of your code here    
    ....

但我认为最好在视图函数中评估视图值并为每个值呈现不同的模板

def page(request):
    # Your code first

    view_value = None
    if request.method=='POST':
        view = request.POST.get['view']


    if view = 'view1':
        render(request, 'your_template.html', context_dict) # If you don't have a context, simply don't include it in this line
    elif view = 'view2':
        render(request, 'your_template2.html', context_dict)

    ... # All your other possible views

    else:
        render(request, 'default_template.html', context_dict) # If there's no match, load the default one.

【讨论】:

以后,请尝试解决问题并发布您拥有的内容、您尝试解决的问题以及没有解决的问题。并不是说我不喜欢编写这个示例。 在禁用 csrf 后它会抛出一个错误:'instancemethod' 对象没有属性 'getitem' for view = request.POST.get['view'] 我能够使用def index(request): context_dict = dict() if request.method == 'POST': view = request.POST['view'] context_dict['view'] = str(view) 克服这些错误,但看起来它刷新了页面并再次查询数据库。你的代码给了我一些想法。非常感谢你的帮忙。看起来我将不得不使用 js-css 解决方案重做我的 div-s,如果我想避免重新加载页面,该解决方案将使用 css 转换对象或显示/隐藏它们。 我的代码中的错误是 context_dict = [ ] ,本来应该是 context_dict =

以上是关于在 django 模板中的数据表示之间切换的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 2.1 中的模板内的 for 循环内设置变量?

如何使用 django 表单/模型来表示字段之间的选择?

django数据库模型

Django学习记录-2-Model

Django学习记录-2-Model

Django:如何根据表单中的选定选项在模板上显示来自 django 数据库的图像?