【问题标题】:Django-CMS - Django Model Form not renderingDjango-CMS - Django 模型表单不呈现
【发布时间】:2018-10-13 10:20:47
【问题描述】:

我正在使用 Django-CMS 在 Django 中构建一个新站点,该站点需要一个表单来过滤 JSON 结果并返回过滤后的集合。

我的问题是,最初,我什至无法让 Django 模型表单呈现,但我可以让 CSRF 令牌工作,因此表单在技术上呈现,但输入/字段根本没有显示.

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 %}

抱歉信息量太大,只是想包含任何人可能需要的任何内容。

正如我所说,CSRF 令牌正在显示,没有任何地方抛出错误,但它根本不显示字段。

非常感谢任何帮助或建议。

【问题讨论】:

  • 如果您检查页面或查看源代码,会在您希望看到表单的位置呈现什么?
  • 表格中没有任何内容。 CSRF 令牌在那里,但没有别的。
  • 好的,您是否使用 Apphook 将您的应用程序连接到 CMS 页面?它没有在 URL 中明确声明,因此您需要通过 CMS 页面连接它。
  • 最初我会通过 url 设置它:url(r'^services/latest-roles/', views.filter_form, name="filter_form" ) 但这似乎没有帮助或正确,虽然我不知道为什么但我认为我是个白痴,视图被命名为索引,所以它应该是呈现的内容而不是表单名称。
  • 是的,我不认为你的观点被称为。如果你想硬编码上面索引视图的 URL,你需要views.index。那么接下来的工作就是处理视图中的getpost方法。

标签: python django django-forms django-cms


【解决方案1】:

我 95% 确定您的视图没有被调用。

您需要将您的应用程序集成为 CMS apphook 或将您的 URL 硬编码到您的根 urls.py 中,这是更容易的集成测试,因为它不依赖于 CMS 集成。

因此,像这样将您的视图添加到您的 URL;

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

然后在您的浏览器中转到localhost:8000/blog/,您应该会点击您的视图。

为了确认你正在点击它,你可以对你的观点做一个简单的修改;

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

然后,如果您的视图被调用,您将在控制台中看到“索引命中”。

【讨论】:

  • 非常感谢您的帮助。事实证明,视图没有被调用,无论我在 url 中添加了什么,它都没有被调用。最后我不得不为它创建一个 Apphook。我仍然不能 100% 确定为什么它不起作用,因为即使是 Divio 的人也说它应该像添加 Django 表单一样简单,但是,嘿,它起作用了!再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 2018-04-30
  • 2012-04-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2019-11-17
相关资源
最近更新 更多