python - 反馈表 Django
问题描述
我终于被反馈表折磨了。结果,它对我有用,但它只适用于项目的单独页面,我需要在站点的每个页面中实现它,以便它与其余内容一起显示。这不是我第一次遇到这样的问题;我无法在一页上同时显示多个模型。
在单独页面的情况下如何实现:
视图.py:
def contact(request):
form_class = ContactForm
if request.method == 'POST':
form = form_class(data=request.POST)
if form.is_valid():
contact_name = request.POST.get(
'contact_name'
, '')
contact_email = request.POST.get(
'contact_email'
, '')
form_content = request.POST.get('content', '')
# Email the profile with the
# contact information
template = get_template('app/contact/contact_template.txt')
context = {
'contact_name': contact_name,
'contact_email': contact_email,
'form_content': form_content,
}
content = template.render(context)
email = EmailMessage(
"New contact form submission",
content,
'', ['mail@mailer.com'],
headers = {'Reply-To': contact_email }
)
email.send()
return redirect('contact')
return render(request, 'app/contact.html', {
'form': form_class,
})
在urls.py中:
...
path('contact/', views.contact, name='contact'),
...
联系人.html:
<h1>Contact</h1>
<form role="form" action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
表格.py:
class ContactForm(forms.Form):
contact_name = forms.CharField(required=True)
contact_email = forms.EmailField(required=True)
content = forms.CharField(
required=True,
widget=forms.Textarea
)
# the new bit we're adding
def __init__(self, *args, **kwargs):
super(ContactForm, self).__init__(*args, **kwargs)
self.fields['contact_name'].label = "Your name:"
self.fields['contact_email'].label = "Your email:"
self.fields['content'].label =
"What do you want to say?"
也许有一些更好的解决方案可以让表单在每个页面上工作?
解决方案
可能您可以context_processor
为此创建自定义。然后将此表单模板添加到基础页脚中,以便在每个页面中呈现。以下是创建自定义上下文处理器的方法:
# context processor
# assuming it is in path /project/your_app/context_processors.py
def get_footer_context(request):
form_class = ContactForm()
return {
'contact_form': form_class
}
然后更新context_processors
settings.py中的:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
# rest of the context_processors
'your_app.context_processors.get_footer_context', # <-- Add your context processor
],
},
},
]
替换your_app
为上下文处理器所在的应用程序名称。
最后,将此代码添加到基本模板的页脚(或随处呈现的通用模板)中:
<h1>Contact</h1>
<form role="form" action="{% url 'app_name:contact' %}" method="POST">
{% csrf_token %}
{{ contact_form.as_p }}
<button type="submit">Submit</button>
</form>
在这里,您需要替换为 urlapp_name
中的app_name
值。
推荐阅读
- unix - 生成连续编号的 url
- arrays - 当仅使用 1 和 0(考虑 CPU 缓存)时,我应该对 md 数组使用按位运算而不是整数类型吗?
- ios - iOS 模拟器在启动时总是要求登录 Apple 帐户
- hadoop - Hive 插入覆盖目录将记录拆分为相等的文件大小
- kotlin - 如何在有对象作用域的环境中调用非扩展“运行”函数(没有作用域/“对象引用”的函数)?
- go - 如何在没有模型的情况下在 gorm 模型结构中使用结构
- javascript - Alfresco Dictionary 使用 javascript 添加大量数据
- reactjs - 如何传递多个值以响应本机上下文 API
- laravel - Laravel Eloquent:belongsToMany 集合获取值
- mongodb - MongoDB - 在对多个文档进行“如果不存在则插入”操作后获取插入和现有文档的 ID