Джанго, форма в меню и форма ввиду противоречивости - PullRequest
0 голосов
/ 25 августа 2011

Я хочу разместить форму в моем меню, чтобы иметь возможность выбрать проект, сохранить эту информацию и иметь возможность изменять ее в любое время на сайте. Я использую context_processor для его реализации и (пытаюсь) использовать переменную сеанса для хранения информации.

Однако я столкнулся с проблемой. Форма входит в базовый шаблон, который входит во все остальные шаблоны. Некоторые из этих других шаблонов также содержат форму, и, по-видимому, существует конфликт между формой меню и другими. Например, когда я пытаюсь проверить форму представления, она говорит мне, что поля формы меню не заполнены, и это не должно волновать это.

Я пытался добавить другой URL-адрес действия без эффекта.

Возможно ли то, что я пытаюсь сделать? Если так, как я могу избежать конфликтов?

Форма для меню вызывается в context_processor, код вызывающей ее функции:

def display_select_proj(request):
        if request.method == "POST":
                form = SelectForm(request.POST)
                if form.is_valid():
                        proj = form.save()

                        request.session['proj'] = proj

        else:
                form = SelectForm()
                proj = ""

        return {'select_form': form}

Я добавил display_select_proj к TEMPLATE_CONTEXT_PROCESSORS и, наконец, в базовом шаблоне я отображаю его с помощью {{ select_form }}

1 Ответ

1 голос
/ 25 августа 2011

Поскольку у вас есть две формы, вам нужно что-то сказать, какая форма действительно была отправлена. Это сообщит вашей функции display_select_proj, пытаться ли проверить форму.

Обычно при простой старой форме у вас есть кнопка «Отправить», а если у вас их две, value для каждой кнопки отправки отличается, поэтому вы можете проверить ее, чтобы узнать, какая форма была отправлена. В противном случае вам нужно добавить скрытое поле, чтобы указать, какая форма была отправлена.

Как только вы сможете определить, какая форма была отправлена, вы можете использовать ее, чтобы выяснить, нужно ли вам связывать форму или оставить ее свободной. Например, в вашем коде, если у вашего селектора проекта есть кнопка «Отправить» с именем «action» со значением «Change Project»:

def display_select_proj(request):
    if request.method == "POST" and (request.POST.get("action", "") 
        == "Change Project"):
        form = SelectForm(request.POST)
        if form.is_valid():
            proj = form.save()
            request.session['proj'] = proj
    else:
        form = SelectForm()
        proj = ""

    return {'select_form': form}

Обратите внимание, что каждой форме потребуется дополнительная проверка, чтобы убедиться, что эта конкретная форма была отправлена.

...