将数据库驱动的消息添加到通过Django-contact-form创建的联系表单

时间:2014-08-27 21:55:47

标签: django django-forms django-admin django-views django-urls

朋友,

我在我的Django支持的网站上使用Django-Contact-Form并且运行良好。

我现在想在表单上方添加一些文本,我宁愿不对文本进行硬编码,但允许通过Django Admin屏幕配置消息。

我想要实现的是这样的:

enter image description here

所以我创建了以下对象:

models.py

class ContactForm(models.Model):
    before_boilerplate = models.CharField(max_length = 8000)
    after_boilerplate = models.CharField(max_length = 8000)

views.py

def contactform(request):
    contactform_text = get_object_or_404(ContactForm, pk=1)
    return render(request, 'contact_form.html', {'contactform_text': contactform_text})

urls.py

...
url(r'^contact/', include('contact_form.urls')),
...

contact_form.html

  ...
  <article>
      <h3>{{ contactform_text.before_boilerplate }}</3>
  </article>
  ...

当我运行联系表单时,我看不到通过Django管理屏幕输入的文本。当我下载到shell并运行相同的命令时,我会看到预期的文本。

我可以看到问题是在urls.py中,调用绕过了我的视图但不幸的是我不知道如何更改它以便我的视图将被使用。

提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,我不太喜欢你的方法:你已经生成了一个模型(=数据库表),它只包含一个行(表单的文本)。您可以使用更通用的方法,例如django-constance(https://github.com/comoga/django-constance)或其他类似的包(https://www.djangopackages.com/grids/g/live-setting/),您可以使用这些方法定义保存到数据库的各种全局设置,而不是这样做。可以通过django管理界面进行编辑。

另外,请不要将您的模型命名为ContactForm。你以后肯定会感到困惑。使用ContactFormTextModel甚至ContactFormTextKeeper之类的内容。但是不要将*Form后缀添加到不是django形式的内容中!

在任何情况下,您的观点存在的问题是,通过加入contact_form.urls,您将使用默认的contact_form.views.ContactFormViewhttp://django-contact-form.readthedocs.org/en/latest/views.html),它对您想要的额外信息一无所知在您的模板中渲染。因此,您必须将contactform_text = get_object_or_404(ContactForm, pk=1)传递给您的视图。

为了完整起见,我将为您提供两个解决方案,一个可以正常工作,但遵循pythonic标准,另一个工作并遵循pythonic标准

  • 第一个:创建一个简单的模板标签,它将输出自定义联系表单文本并在模板中使用它:所以,在您的应用程序中添加一个templatetags / contact_tags.py文件,其中包含以下内容(或类似内容) :
from django import template
from django.conf import settings
import applications.models

register = template.Library()

@register.simple_tag
def render_form_text():
    return get_object_or_404(ContactForm, pk=1)

现在,您可以在模板中使用 {% load contact_tags %}{% render_form_txt %}呈现表单文本。

这是不是正确的解决方案。您正在创建仅需要一次的模板标记 - 而应将form_text直接传递给视图。怎么做?

  • 第二个解决方案:子类ContactFormView以在您的上下文数据中包含所需信息。因此,请在views.py
  • 中添加以下内容
from contact_form.views import ContactFormView

class FormTextContactFormView(ContactFormView):
    def get_context_data(self, **kwargs):
        context = super(FormTextContactFormView, self).get_context_data(**kwargs)
        context['form_text'] = get_object_or_404(ContactForm, pk=1)
        return context

现在,在您的urls.py中,您可以使用上面的CBV:

    url(r'^contact/', views.FormTextContactFormView.as_view(), name='contact' ),

在您的模板中,您将拥有一个名为{{ form_text }}的上下文变量。