Sunday, January 31, 2016

Re: Django formtools wizard produces blank page (No error returned)

Hi, James,

I'm trying with the django-debug-toolbar. I can't see anything because the message "500: INTERNAL SERVER ERROR" appears. I tried in all the options and keeps showing this 500 code message.

But it comes to my attention that, for example, the tooltip for "templates" shows "3 templates rendered". Anyway, I can't get the headers, the request or anything using the django-debug-toolbar. :-(

I will keep on with testing this.

On 30 January 2016 at 17:23, Martín Torre Castro <martin.torre.castro@gmail.com> wrote:

I can't see the initial load, which is the same as saying that the first step does not load.

El 30 ene. 2016 1:56 p. m., "James Schneider" <jrschneider83@gmail.com> escribió:

Your view is returning a 200 code, so it thinks it is finishing correctly with no errors, probably the reason you don't see any errors.

At what point do you get a blank page? Initial load? Final step? Does the template in your done() step exist? Have you installed the Django-debug-toolbar to examine the context of your blank page?

-James

On Jan 30, 2016 2:18 AM, "Martin Torre Castro" <madtyn@gmail.com> wrote:
I'm trying to use the formwizard in formtools package with no success (I was able to do it when the package was inside Django in earlier versions). 

The only response I got is:

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

and a blank page. No errors in browser or Eclipse console.

There's no way of googling without errors. Please help.

Thanks in advance

(If you guys find more comfortable stackoverflow, you can go to http://stackoverflow.com/q/34962499/1241715)


What did I do?

Firstly, I installed the formtools package with pip:

    django-formtools==1.0
    Django==1.8.3


Following the instructions of the official docs:

  1. Define form classes

    registration/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. Create 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. Create the templates

    registration/test_step1.html

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

    registration/test_step2.html

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

    registration/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. Add 'formtools' to my 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. Point my URLconf at your WizardView as_view() method.

    registration/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'),
    )

    For the second way...

    registration/views.py

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


--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/333f094e-3b3f-4235-b3df-1b5d76c3004f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-users/mAi_fB_MTwo/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CA%2Be%2BciXR%3DgaO142Q4mLVrtw4hEtVnbV7L2N49zeNOhp9Y1Fd4A%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAKijOkxOOrk6VWm_2D%3DFWT%3Dz%2BqANZCX08LJqxY9b2bf1aX3LJQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment