django - 如何在 django 中创建模板标签并使用 Form?

标签 django django-forms django-templates

我创建自定义 django 模板并使用表单:

这是文件 ratings.py 使用标签:

from django import template
from django.contrib.contenttypes.models import ContentType
from Ratings.forms import RatingsForm

register = template.Library()

class RatingFormNode(template.Node):
    def __init__(self, content, id, varname):
        self.content = content.split('.')
        self.varname = varname
        self.id = template.Variable(id)

    def render(self, context):
        id = self.id.resolve(context)
        content = ContentType.objects.get(app_label=self.content[0], model=str(self.content[1]).lower())
        context[self.varname] = RatingsForm(initial={'content_type': content, 'object_id': id})
        return ''

@register.tag(name='rating')
def rating(parser, token):
    """
    {% rating appname.Modelname 1 as Newsletter_Form %}
    """
    bits = token.split_contents()

    if bits[3] != 'as':
        raise template.TemplateSyntaxError, "third argument to the get_latest tag must be 'as'"

    return RatingFormNode(bits[1], bits[2], bits[4])

我在模板文件中使用这个标签:
{% rating appname.Modelname id as rating_form %}
<form action="{% url 'ratings_add' %}" method="POST">
    {% csrf_token %}
    {{ rating_form }}
    <input type="hidden" name="url" value="{{ post.slug }}" />
    <input type="submit" value="Wyślij" />
</form>

这是 urls.py:
from django.conf.urls import patterns, url

urlpatterns = patterns('Ratings.views',
    url(r'^add/$', 'ratings_add', name='ratings_add'),
)

并创建 View 以获取 url:
# -*- coding: utf-8 -*-
from django.core.urlresolvers import reverse
from django.http.response import Http404
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from Ratings.forms import RatingsForm


def ratings_add(request):
    if not request.method == 'POST':
        return Http404
    form = RatingsForm(request.POST)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect(reverse('post', args=[request.POST.get('url')]))
    else:
        request.session['form_data'] = request.POST
        return redirect(reverse('post', args=[request.POST.get('url')]), form=form)

我在模板中使用此标签,网址为:“/post/name-this-post/”。
Tag 创建模型“Rating”的“RatingForm”形式。当查看您的页面并使用表单且表单有效的人时,这是有效的(保存表单并重定向到页面“/post/name-this-post/”),但是当发生错误时,您被重定向但不显示一个错误。我该如何解决?

最佳答案

首先,将尝试将块包含到您的模板文件中:

{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}


其次,是否存在 View postviews.pyredirect(reverse('post', args=[request.POST.get('url')]), form=form) ?此外存在条目url(...)urlpatternsurls.pypost看法?如果两者都存在,请将其添加到问题的代码中

关于django - 如何在 django 中创建模板标签并使用 Form?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361276/

相关文章:

python - 反转 'update_comment',参数为 '(' ',)' not found. 1 pattern(s) tried: [' comment\\/(?P<news_pk>[0-9]+)$']

python - Django 模型选择选项,填充了来自其他模型实例的字段

python - Fom 缺少 1 个必需的位置参数 : 'request' in form

python - django - 模板中的列表列表

python - 如何将 django 链接到我自己的 404 错误页面?

django - Supervisord 抛出错误 : "couldn' t exec/var/application/gunicorn_start: ENOEXEC"

django - 两个字段注释的乘积

python - celery 结果错误 "args must be a list or tuple"

python - Django 应用程序运行良好,但收到 TEMPLATE_* 警告消息

django - 从扩展模板覆盖 `include` d 模板中的 block