Django:与模板变量一起返回模板

Posted

技术标签:

【中文标题】Django:与模板变量一起返回模板【英文标题】:Django: Return to template along with template variables 【发布时间】:2017-07-16 19:43:45 【问题描述】:

我正在使用 Django 构建一个师生门户。 我有两组用户——教师和学生。如果用户是老师,我需要提供不同的模板(用于选择学生注册号的表格)。我跟着this 链接做同样的事情。

这里是sn-ps的代码:

home.html

    % if is_teacher %
    <p style="color:blue; text-align:center; font-size:160%"><b>Course taken: <span style="color:green"><a href="course/">IT000</a></span></b></p>
    <form action="/" method="post" align="center">
        % csrf_token %
        <div align="center"> form </div>
        <input type="submit" value="Get student's results!" class="btn btn-primary" style="margin-top:10px"/>
    </form>
    % else %
    <p style="color:blue; text-align:center; font-size:160%"><b>Performance for the subject <span style="color:green"><a href="course/">IT000</a></span> is shown below.</b></p>
    % endif %

views.py

@login_required(login_url="login/")
def home(request):
    is_teacher = request.user.groups.filter(name='teachers').exists()
    if is_teacher:
        if request.method == 'POST':
            form = Regno(request.POST)
            if form.is_valid():
               selected_reg = Student.objects.filter(regno=request.POST.get('regno'))
               return render(request, 'home.html','selected_reg': selected_reg,'form':form)
        else:
           form = Regno()
           return render(request, 'home.html', 'form': form,'user':request.user,'is_teacher':is_teacher)
    else:
        selected_reg = Student.objects.filter(regno=request.user)
    return render(request, 'home.html', 'user':request.user,'is_teacher':is_teacher,'selected_reg':selected_reg)

这里,Regno 是老师输入学生注册号的表格。

当教师最初登录时,会显示该表单。但是,在他提交表单后,它没有显示表单。它执行模板的 % else % 部分。教师提交表单后,如何确保将 is_teacher 模板变量传递给该模板? 我阅读了有关 Django 会话的信息,但我不确定它是否有帮助。

【问题讨论】:

【参考方案1】:

您应该使用RequestContext 将它与您的请求一起传递,而不是每次都传递 is_teacher。

看起来在表单提交的帖子调用中,您没有传递 is_teacher 变量。 (在下面的代码中)

if form.is_valid():
    selected_reg = Student.objects.filter(regno=request.POST.get('regno'))
    return render(request, 'home.html','selected_reg': selected_reg,'form':form)

您应该在上面添加is_teacher

另外,通过custom template tag 处理它的更好方法-

register = template.Library()

@register.filter(name='has_group')
def has_group(user, group_name):
    group = Group.objects.get(name=group_name)
    return True if group in user.groups.all() else False

在模板中 -

% if request.user|has_group:'teachers' %
    ....
% else %
    ....
% endif %

您可以避免在每次调用时传递它。希望对您有所帮助。

【讨论】:

以上是关于Django:与模板变量一起返回模板的主要内容,如果未能解决你的问题,请参考以下文章

django模板语法

Django框架之模板

更正 Django 模板 url 变量以与通用视图 list_detail 一起使用

django 的模板标签“include”如何与 None 一起使用

将进度返回到 Django 中每个值更改的模板

如何将上下文变量与 Django 模板中的 SQL ID 进行比较?