朋友,
我在我的Django支持的网站上使用Django-Contact-Form并且运行良好。
我现在想在表单上方添加一些文本,我宁愿不对文本进行硬编码,但允许通过Django Admin屏幕配置消息。
我想要实现的是这样的:
所以我创建了以下对象:
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中,调用绕过了我的视图但不幸的是我不知道如何更改它以便我的视图将被使用。
提前致谢。
答案 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.ContactFormView
(http://django-contact-form.readthedocs.org/en/latest/views.html),它对您想要的额外信息一无所知在您的模板中渲染。因此,您必须将contactform_text = get_object_or_404(ContactForm, pk=1)
传递给您的视图。
为了完整起见,我将为您提供两个解决方案,一个可以正常工作,但不遵循pythonic标准,另一个工作并遵循pythonic标准。
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 }}
的上下文变量。