Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django在每页上添加反馈表_Django_Django Forms_Django Views - Fatal编程技术网

Django在每页上添加反馈表

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.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))
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变量。这样我就可以验证并返回到同一页面。这是可行的,但它看起来是合理的模式吗?我做了一些更改来帮助您。你在我的回答中有全部的逻辑。您在实现它时不应该有问题。谢谢您提供了一个非常全面的答案!