WedX - журнал о программировании и компьютерных науках

Мастер Django formtools создает пустую страницу (ошибка не возвращается)

Я безуспешно пытаюсь использовать formwizard в пакете formtools (мне удавалось это сделать, когда пакет находился внутри Django в более ранних версиях).

Единственный ответ, который я получил, это:

[23/Jan/2016 11:06:50]"GET /registration/wizard HTTP/1.1" 200 13729

и пустая страница. Никаких ошибок в браузере или консоли Eclipse.

Без ошибок гуглить нельзя. Пожалуйста помоги.

заранее спасибо

Что я сделал?

Во-первых, я установил пакет formtools с помощью pip:

django-formtools==1.0
Django==1.8.3

Следуя инструкциям официальных документов:

  1. Определить классы формы

    регистрация/forms.py

    class StepForm1(forms.Form):
        first_field = forms.CharField(max_length=100)
        second_field = forms.CharField()
    
    class StepForm2(forms.Form):
        message = forms.CharField(widget=forms.Textarea)
    
  2. Создать WizardView

    registration/views.py

    TEST_TEMPLATES = {"test_step_1": "registration/test_step1.html", "test_step_2": "registration/test_step2.html", }
    
    from formtools.wizard.views import SessionWizardView
    
    class WizardTest(SessionWizardView):
        template_name = 'registration/test_wizard.html'
    
        # Return templates for each step
        def get_templates_name(self):
            return [TEST_TEMPLATES[self.steps.current]]
    
        # Method called when all is done
        def done(self, form_list, **kwargs):
    
            # return HttpResponseRedirect('/url-to-redirect-to/') 
    
            # We return the final template with the info
            return render_to_response('test_done.html', {
                                       'form_data':[form.cleaned_data for form in form_list],
                                       })
    
        # THESE METHODS BELOW ARE NOT NEEDED, BUT COMMENTED FOR FUTURE USE
    
        # Not strictly needed. Returns data for a step
        # or None if form is not valid
        # def get_cleaned_data_for_step(self, step):
        #     return None
    
        # Form data postprocessing in a concrete wizard step
        # def process_step(self, form):
        #     return self.get_form_step_data(form)
    
        # Handles value from a step before storing them into wizard
        # def get_form_step_data(self, form):
        #     return form.data
    
  3. Создайте шаблоны

    регистрация/test_step1.html

    <h1>Two fields form</h1>
    <input id="first_field" name="first_field">
    <input id="second_field" name="second_field">
    

    регистрация/test_step2.html

    <h1>Message form</h1>
    <input id="message" name="message">
    

    регистрация/test_wizard.html

    {% extends "person/alumnos.html" %}
    {% load i18n %}
    
    {% block head %}
        {{ wizard.form.media }}
    {% endblock head %}
    
    {% block content %}
    <p>{% trans "Step {{wizard.steps.step1}} of {{wizard.steps.count}}" %}</p>
    
    <form action="" method="post">
    {% csrf_token %}
    
    {{ wizard.management_form }}
    
    {% if wizard.form.forms  %}
        {{ wizard.form.management_form }}
        {% for form in wizard.form.forms %}
            {{form}}
        {% endfor %}
    {% else %}
        {{ wizard.form }}
    {% endif %}
    
    {% if wizard.steps.prev %}
    <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "Beginning" %}</button>
    <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "Previous step" %}</button>
    {% endif %}
    <input type="submit" value="submit"/>
    
    </form>
    
    {% endblock %}
    
  4. Добавить «formtools» в мои INSTALLED_APPS

    settings.py

    DJANGO_APPS = (
        # Default Django apps:
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'formtools',                 # <===== HERE
    
        # Useful template tags:
        # 'django.contrib.humanize',
    
        # Admin panel and documentation:
        'django.contrib.admin',
        # 'django.contrib.admindocs',
    )
    
    # Apps specific for this project go here.
    LOCAL_APPS = (
        'person',
        'registration',
        'teaching',
        'utils',
    )
    
    # See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
    INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS
    
  5. Укажите мой URLconf на ваш метод WizardView as_view().

регистрация/urls.py

from registration.forms import StepForm1, StepForm2
TEST_FORMS = [("test_step_1", StepForm1), ("test_step_2", StepForm2), ]

from registration.views import WizardTest

# I tried in two ways, none of them worked

urlpatterns = patterns('',
         url(r'^wizard$', WizardTest.as_view(TEST_FORMS), name='wizard_test'),
         url(r'^wizard2$', views.wizard, name='wizard_test'),
)

Для второго способа...

registration/views.py

def wizard(request):
    return WizardTest.as_view(TEST_FORMS)(request)

Ответы:


1

Какому примеру вы следуете в своих шаблонах? Основной макет находится в документации. Попробуйте начать с чего-то вроде этого (обе страницы могут использовать один и тот же шаблон, если у вас все в порядке с полями, созданными инструментами форм):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Form Wizard</title>
    {{ wizard.form.media }}

</head>
<body>
{% load i18n %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
    {{ wizard.form.management_form }}
    {% for form in wizard.form.forms %}
        {{ form }}
    {% endfor %}
{% else %}
    {{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
{% endif %}
<input type="submit" name="submit" value="{% trans "submit" %}"/>
</form>
</body>
</html>
23.01.2016
  • Я отредактировал сообщение, чтобы показать шаблон мастера. Это еще не работает 26.01.2016
  • Мой последний комментарий был отредактирован, потому что его могли неправильно понять. Я в той же ситуации, и основной шаблон для формы всегда был одним и тем же (я только забыл поместить его в этот пост stackoverflow при его создании) 30.01.2016

  • 2

    Я нашел свою ошибку. Я неправильно набрал имя метода для получения шаблонов. Это не

    get_templates_name(self)
    

    но

    get_template_names(self)
    

    Он не получал никаких шаблонов, но при возврате на сервер отвечал HTTP 200 OK, потому что не обнаружил никакой ошибки.

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

    07.02.2016

    3

    Основная проблема, из-за которой self.cleaned_data['field'] оказалось для меня пустым, заключается в том, что мне нужно было использовать form.field.html_name вместо form.field.name для поля имени шаблона.

    Однако не все так ясно из документации, предоставленной Django formtools. Вот выдержка из моей страницы шаблона, так что это еще яснее:

    <div class="form-group">
      <label>{{ form.account_name.label }}</label>
      <input name="{{ form.account_name.html_name }}"
             value="{{ form.account_name.value|default_if_none:'' }}"
             class="form-control">
    </div>
    
    10.09.2018
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]