Django在每页上添加反馈表
我有一个用于用户反馈的表单视图: url.py:Django在每页上添加反馈表,django,django-forms,django-views,Django,Django Forms,Django Views,我有一个用于用户反馈的表单视图: url.py: url( r'^feedback/$', 'tool.views.Feedback', name='feedback' ), url( r'^thanks/$', direct_to_template, { 'template': 'tool_feedback_thanks.html' }, name='feedback_thanks' ), class FeedbackF
url(
r'^feedback/$',
'tool.views.Feedback',
name='feedback'
),
url(
r'^thanks/$',
direct_to_template, {
'template': 'tool_feedback_thanks.html'
},
name='feedback_thanks'
),
class FeedbackForm(forms.Form):
yes_no = forms.ChoiceField(
choices=YES_NO_CHOICE,
initial=1,
widget=forms.RadioSelect(attrs={'class': 'can_reveal_input'}),
label="Are you happy with Our service?"
)
comments = forms.CharField(
widget=forms.Textarea(attrs={
'class': 'hidden', 'placeholder': 'Leave us your comments...'
}),
required=False,
label=""
)
def Feedback(request,
template_name='tool_feedback.html'):
title = u'Leave us some feedback'
form = FeedbackForm(request.POST or None)
if form.is_valid():
yes_no = form.cleaned_data['yes_no']
comments = form.cleaned_data['comments']
sender = "A Unirac website user"
recipients = ['person@example.com']
send_mail(yes_no, comments, sender, recipients)
return HttpResponseRedirect(
reverse('feedback_thanks')
)
return render_to_response(template_name, {
'title': title,
'form': form,
}, RequestContext(request))
forms.py:
url(
r'^feedback/$',
'tool.views.Feedback',
name='feedback'
),
url(
r'^thanks/$',
direct_to_template, {
'template': 'tool_feedback_thanks.html'
},
name='feedback_thanks'
),
class FeedbackForm(forms.Form):
yes_no = forms.ChoiceField(
choices=YES_NO_CHOICE,
initial=1,
widget=forms.RadioSelect(attrs={'class': 'can_reveal_input'}),
label="Are you happy with Our service?"
)
comments = forms.CharField(
widget=forms.Textarea(attrs={
'class': 'hidden', 'placeholder': 'Leave us your comments...'
}),
required=False,
label=""
)
def Feedback(request,
template_name='tool_feedback.html'):
title = u'Leave us some feedback'
form = FeedbackForm(request.POST or None)
if form.is_valid():
yes_no = form.cleaned_data['yes_no']
comments = form.cleaned_data['comments']
sender = "A Unirac website user"
recipients = ['person@example.com']
send_mail(yes_no, comments, sender, recipients)
return HttpResponseRedirect(
reverse('feedback_thanks')
)
return render_to_response(template_name, {
'title': title,
'form': form,
}, RequestContext(request))
视图。py:
url(
r'^feedback/$',
'tool.views.Feedback',
name='feedback'
),
url(
r'^thanks/$',
direct_to_template, {
'template': 'tool_feedback_thanks.html'
},
name='feedback_thanks'
),
class FeedbackForm(forms.Form):
yes_no = forms.ChoiceField(
choices=YES_NO_CHOICE,
initial=1,
widget=forms.RadioSelect(attrs={'class': 'can_reveal_input'}),
label="Are you happy with Our service?"
)
comments = forms.CharField(
widget=forms.Textarea(attrs={
'class': 'hidden', 'placeholder': 'Leave us your comments...'
}),
required=False,
label=""
)
def Feedback(request,
template_name='tool_feedback.html'):
title = u'Leave us some feedback'
form = FeedbackForm(request.POST or None)
if form.is_valid():
yes_no = form.cleaned_data['yes_no']
comments = form.cleaned_data['comments']
sender = "A Unirac website user"
recipients = ['person@example.com']
send_mail(yes_no, comments, sender, recipients)
return HttpResponseRedirect(
reverse('feedback_thanks')
)
return render_to_response(template_name, {
'title': title,
'form': form,
}, RequestContext(request))
这是一种享受,但现在客户要求在每一页上都包含此表单。我想表单可以通过js提交到适当的url,但是在每个页面上包含未绑定表单的最佳方式是什么
任何帮助都将不胜感激。我相信最简单的包含表单的方法是使用: 在模板库中:
@register.assignment_tag
def feedback_form(format_string):
return FeedbackForm()
模板中
{% feedback_form as form %}
{# display form... %}
{{ form.as_p }}
我会创建一个上下文处理器,在每个视图中包含表单 编辑:
url(
r'^feedback/$',
'tool.views.Feedback',
name='feedback'
),
url(
r'^thanks/$',
direct_to_template, {
'template': 'tool_feedback_thanks.html'
},
name='feedback_thanks'
),
class FeedbackForm(forms.Form):
yes_no = forms.ChoiceField(
choices=YES_NO_CHOICE,
initial=1,
widget=forms.RadioSelect(attrs={'class': 'can_reveal_input'}),
label="Are you happy with Our service?"
)
comments = forms.CharField(
widget=forms.Textarea(attrs={
'class': 'hidden', 'placeholder': 'Leave us your comments...'
}),
required=False,
label=""
)
def Feedback(request,
template_name='tool_feedback.html'):
title = u'Leave us some feedback'
form = FeedbackForm(request.POST or None)
if form.is_valid():
yes_no = form.cleaned_data['yes_no']
comments = form.cleaned_data['comments']
sender = "A Unirac website user"
recipients = ['person@example.com']
send_mail(yes_no, comments, sender, recipients)
return HttpResponseRedirect(
reverse('feedback_thanks')
)
return render_to_response(template_name, {
'title': title,
'form': form,
}, RequestContext(request))
要让用户访问他/她正在浏览的前一个URL,您可以只使用URL
# yourapp/context_processors.py
def feedback_form_context_processor(request):
return {
'feedback_form': FeedbackForm(),
'feedback_form_url': reverse("feed_app:form_process", args=(request.path))
}
这就是URL.py的外观:
urlpatterns = patterns('feed_app.views',
url(r'^process-feedback-form/(?P<next_url>\d+)', 'form_process', name='form_process'),
)
而且,您应该对模板进行结构调整,使其具有正确的布局。例如,具有基本模板:
# templates/base.html
<html>
<body>
..
{% block maincontent %}
{% endblock %}
..
{# The form!!! #}
<form action='{{feedback_form_url}}' method='POST'>
@csrftoken
{{ feedback_form.as_p }}
</form>
</body>
</html>
再加上@bmihelac,who的答案对我来说非常有效。由于django 2.0
assignment\u tag
支持simple\u tag
。因此,您可以通过将作业标记
替换为简单标记
来完全遵循他的答案,如下所示:
from django import template
from .forms import FeedbackForm
register = template.Library()
@register.simple_tag
def feedback_form():
return FeedbackForm()
然后,只需参考有关如何将其导入模板的信息 好的-这看起来很有趣-你能为我的用例详细说明一下吗?我应该在我的视野中使用装饰器吗?我可以将其包含在
base.html
模板中吗?您不需要decorator,您可以在base.html
模板中使用它。只需将模板库包含在base.html中。如果您使用ajax或其他URL处理表单处理,这是最简单的。因此,“just_a_random_template.html”应该是我用于不同表单的模板(即tool_feedback.html)?不,这只是一个需要编写的视图示例。那just\u a\u random\u template.html
可以是login.html
或process\u purchase.html
。我们的想法是,视图中使用的所有模板都是从包含表单的base.html扩展而来的。因此,我在我的base.html
中包含了上下文处理器中的表单,并将表单定向到现有视图,将页面url作为GET变量。这样我就可以验证并返回到同一页面。这是可行的,但它看起来是合理的模式吗?我做了一些更改来帮助您。你在我的回答中有全部的逻辑。您在实现它时不应该有问题。谢谢您提供了一个非常全面的答案!