Django:返回模板以及模板变量

时间:2017-02-26 04:12:44

标签: django forms django-templates

我正在使用Django建立一个学生 - 教师门户网站 我有两组用户 - 老师和学生。如果用户是教师,我需要提供不同的模板(用于选择学生注册号的表格)。我按照this链接执行相同操作。

以下是代码段:

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 个答案:

答案 0 :(得分:1)

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

在表单提交的帖子调用中,您没有传递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 %}

您可以避免每次通话都传递它。希望它有所帮助。