我想把一个登录表单放在我的网页中的任何地方,所以我添加了一个context_processor,并将其包含在base.html文件中。现在的问题是我看不到表单。
这是我的context_processors.py:
def global_login_form(request):
if request.method == 'POST':
formLogin = LoginForm(data=request.POST)
if formLogin.is_valid():
from django.contrib.auth import login
login(request, formLogin.get_user())
...
else:
formLogin = LoginForm()
return {'formLogin': formLogin}下面是我在base.html中尝试调用表单的不同htmls:
<form action="/myapp/login/" method="post">
{% csrf_token %}
{{global_login_form}}
</form>
<form action="/myapp/login/" method="post">
{% csrf_token %}
{{global_login_form.as_p}}
</form>
<form action="/myapp/login/" method="post">
{% csrf_token %}
{{request.formLogin}}
</form>第一次加载页面时,context_process返回{'formLogin': formLogin} (因为formLogin为LoginForm()),但在检查html时看不到表单。它不在那里。但是我可以看到csrf_token,所以我想我没有正确地调用上下文。
只是这种情况(可能顺序不正确),这里是settings.py:
TEMPLATE_CONTEXT_PROCESSORS = (
"myapp.context_processors.global_login_form",
"django.core.context_processors.request",
"django.contrib.auth.context_processors.auth",
)有什么想法吗?
发布于 2011-11-29 14:01:31
我认为OP错误地假设模板上下文变量将与上下文处理器的函数名相匹配。
OP的上下文处理器global_login_form()将formLogin注入到模板上下文中。因此,在模板中,表单应该引用为,例如,{{ formLogin.as_p }}。
发布于 2011-06-27 18:00:55
您必须在每个视图中都有表单变量,否则您应该实现一个模板标签。示例:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-tags
from django import template
from django.contrib.auth.forms import AuthenticationForm
register = template.Library()
@register.inclusion_tag('registration/login.html', takes_context=True)
def login(context):
"""
the login form
{% load login %}{% login %}
"""
request = context.get('request', None)
if not request:
return
if request.user.is_authenticated():
return dict(formLogin=AuthenticationForm())
return dict(user=request.user) 发布于 2011-09-01 16:10:40
我想在我的网站上到处使用,给出一个信号,你可能需要一个模板上下文处理器。
def global_login_form(request):
next = request.GET.get('next', '/')
login_form = AuthenticationForm(initial={'next': next})
return {'login_form': login_form}有了这个,并将这个上下文处理器添加到设置中的TEMPLATE_CONTEXT_PROCESSORS部分,您就可以在模板中使用{{global_login_form}}了。
你可能会或多或少的得到类似这样的东西
....
<form action="{% url login_view_name %}" method="POST">
{{global_login_form.as_p}}
</form>
....我在我的一个项目中使用了这个模式,它工作得很好。这里只需注意,如果表单未被验证,最好在单独的页面上显示错误的表单。下面是该视图的一个示例:
def login(request):
if request.method == "POST":
login_form =LoginForm(data=request.POST)
if login_form.is_valid():
next = login_form.cleaned_data.get('next', '/')
login(request, login_form.get_user())
return HttpResponseRedirect(next)
return render_to_response(
'users/login/login_page.html',
{'form': login_form},
context_instance=RequestContext(request),
)https://stackoverflow.com/questions/6491046
复制相似问题