簡體   English   中英

Django - 使用context_processor

[英]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} (因為formLoginLoginForm() )但是在檢查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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM