[英]Django - Using context_processor
我想在我的網頁中隨處放置一個登錄表單,所以我添加了一個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",
)
有任何想法嗎?
您必須在每個視圖中都有表單變量,或者您應該實現模板標簽。 例:
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)
我認為OP錯誤地認為模板上下文變量將匹配上下文處理器的函數名稱。
OP的上下文處理器global_login_form()
將formLogin
注入模板上下文。 因此,在模板中,表單應該被引用為,例如{{ formLogin.as_p }}
。
我想在我的網站上的任何地方使用,發出一個信號,表明您可能需要模板上下文處理器。
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),
)
class MyForm(forms.Form):
username = forms.CharField(widget=forms.TextInput(attrs={'class':'login_text'}))
password = forms.CharField(widget=forms.TextInput(attrs={'class':'password_text'}))
這可能是您的解決方案。 Css作為表單字段的屬性傳遞,因此您無需在html中明確聲明它。
不要試圖把POST沒有真正發布的東西放進去。 如果您需要獲取模板標簽的一些信息,只需使用上下文。
最后,我使用中間件來處理請求,而不是使用context_processor。 此外,我刪除了我的登錄視圖,並將表單操作更改為“。” 所以登錄功能在中間件中。
我按照這個問題找到了解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.