Django - Использование context_processor - PullRequest
3 голосов
/ 27 июня 2011

Я хочу разместить форму входа везде на моей веб-странице, поэтому я добавил 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}

И вот отличия htmls, которые я пробовал в base.html при попытке вызвать форму:

<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",
)

Есть идеи?

Ответы [ 6 ]

4 голосов
/ 29 ноября 2011

Я считаю, что OP неправильно предположил, что переменная контекста шаблона будет соответствовать имени функции процессора контекста.

Процессор контекста OP global_login_form() внедряет formLogin в контекст шаблона.Поэтому в шаблонах на форму следует ссылаться, например, {{ formLogin.as_p }}.

4 голосов
/ 27 июня 2011

у вас должна быть переменная формы в каждом представлении, или вы должны вместо этого реализовать тег шаблона.пример:

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) 
3 голосов
/ 01 сентября 2011

Я хочу использовать везде на моем сайте дает сигнал, что вам может понадобиться процессор контекста шаблона.

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),
        )
0 голосов
/ 06 октября 2011

Наконец, я использовал промежуточное ПО для обработки запроса, вместо использования context_processor. Кроме того, я удалил свой вид входа в систему и изменил действие формы на «.» поэтому функциональность входа в систему находится в промежуточном программном обеспечении.

Я следовал на этот вопрос , чтобы найти решение.

0 голосов
/ 29 августа 2011

Не пытайтесь поместить в POST что-то, что на самом деле не было POST.Если вам нужно получить некоторую информацию для тега шаблона, просто используйте контекст.

0 голосов
/ 27 июня 2011
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...