Search code examples
pythondjangodjango-formsdjango-cms

Django-CMS - Django Model Form not rendering


I'm building a new site in Django with Django-CMS that needs a form to filter JSON results and return the filtered set.

My issue is that, initially, I can't even get the Django Model Form to render yet I can get the CSRF token to work so the form is technically rendering, but the inputs/fields aren't showing up at all.

models.py:

from django.db import models

from .jobs.jobs import *

roles = get_filters()

loc = roles[0]
j_type = roles[1]
industry = roles[2]

class Filter(models.Model):
    country = models.CharField(max_length=255)
    job_type = models.CharField(max_length=255)  
    industry = models.CharField(max_length=255)
    search = models.CharField(max_length=255)

jobs/jobs.py

try:
    from BeautifulSoup import BeautifulSoup
except ImportError:
    from bs4 import BeautifulSoup

import urllib3 
import json 

http = urllib3.PoolManager()

def get_filters():

    response = http.request('GET', 'http://206.189.27.188/eo/api/v1.0/jobs')

    jobs = json.loads(response.data.decode('UTF-8'))

    job_list = []

    for job, values in jobs.items():
        job_list.append(values)

    roles_data = []

    for job in job_list[0]:
        roles_data.append(job)

    roles_data = sorted(roles_data, key=lambda role : role["id"], reverse=True)

    loc = []
    j_type = []
    industry = []

    for role in roles_data:
        loc.append(role['location'])
        j_type.append(role['type'])
        industry.append(role['industry'])

    return loc, j_type, industry

views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect

from .forms import FilterForm

def index(request):
    form = FilterForm()
    context = {
        'form': form,
    } 
    return render(request, 'blog.html', context)

forms.py

from django.forms import ModelForm

from .models import Filter

class FilterForm(ModelForm):
    class Meta:
        model = Filter
        fields = ['country', 'job_type', 'industry', 'search']

urls.py

from __future__ import absolute_import, print_function, unicode_literals

from cms.sitemaps import CMSSitemap
from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from django.contrib.sitemaps.views import sitemap
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.static import serve

from . import views

admin.autodiscover()

urlpatterns = [
    url(r'^sitemap\.xml$', sitemap,
        {'sitemaps': {'cmspages': CMSSitemap}}),
    url(r'^accounts/', admin.site.urls),
    url(r'^services/latest-roles/', views.filter_form, name="filter_form" )
]

urlpatterns += i18n_patterns(
    url(r'^admin/', include(admin.site.urls)),  # NOQA
    url(r'^', include('cms.urls')),
)

# This is only needed when using runserver.
if settings.DEBUG:
    urlpatterns = [
        url(r'^media/(?P<path>.*)$', serve,
            {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
        ] + staticfiles_urlpatterns() + urlpatterns

blog.html

{% extends 'includes/templates/layout.html' %}
{% load cms_tags i18n sekizai_tags zinnia %}

{% block main_content %}
    {% include 'components-header-image.html' %}

    <section class="module">
            <div class="container">
                <div class="row">
                        <div class="col-md-12 m-auto text-center">
                            <form action="POST" class="col-md-12">
                                {% csrf_token %}
                                {{ form.as_p }}
                                <button name="submit" class="btn btn-brand">Search</button>
                            </form>
                            {% get_all_roles%}
                        </div>
                            <div class="col-md-12">
                                <div class="space" data-MY="120px"></div>
                            </div>
                        <div class="col-md-12 flex-center text-center">
                            {% placeholder 'jobs-bottom-statement' %} 
                        </div>
                    </div>
            </div>
    </section>


          <!-- Image-->
          {% include 'components-contact.html' %}

          <!-- Image end-->
{% endblock %}

Sorry for the masses of information, just wanted to include anything anyone might need.

As I said, the CSRF token is displaying, nothing is throwing an error anywhere but it's just not displaying the fields at all.

Really appreciate any help or advice.


Solution

  • I'm 95% sure your view isn't being called.

    You need to integrate your application as a CMS apphook or hard code your URLs into your root urls.py which is the easier integration test as it doesn't depend on CMS integration.

    So Add your view to your URLs like this;

    urlpatterns += i18n_patterns(
        url(r'^admin/', include(admin.site.urls)),  # NOQA
        url(r'^blog/$', views.index, name='blog'),
        url(r'^', include('cms.urls')),
    )
    

    Then go to localhost:8000/blog/ in your browser & you should hit your view.

    To confirm you're hitting it you could make a simple amendment to your view;

    def index(request):
        form = FilterForm()
        context = {
            'form': form,
        } 
        print "index hit"
        return render(request, 'blog.html', context)
    

    Then you'll see "index hit" in your console if your view is called.