2016-01-23 2 views
2

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

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

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

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

Нет ошибок при поиске без ошибок. Пожалуйста помоги.

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

Что я сделал?

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

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

    регистрация/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. Направьте свой URL-адрес в свой метод 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'), 
) 

Для второго пути ...

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

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

ответ

1

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

get_templates_name(self) 

но

get_template_names(self) 

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

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

2

Какой пример вы следуете за шаблонах? The basic layout is in the docs. Попробуйте начать с чем-то вроде этого (обе страницы могут использовать один и тот же шаблон, если все в порядке с полями, генерируемыми formtools):

<!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> 
+0

Я отредактировал сообщение, чтобы показать шаблон мастера. Он еще не работает – madtyn

+0

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