如何在django中创建模板标记并使用表单?
我创建自定义django模板并使用表单: 这是文件ratings.py使用标记:如何在django中创建模板标记并使用表单?,django,django-forms,django-templates,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_
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])
我在tempalte文件中使用此标记:
{% 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>
并创建视图以获取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)
我在模板中使用这个标记,url为:“/post/name this post/”。
标记创建模型“Rating”的“RatingForm”形式。当查看您的页面并使用表单的人和表单有效时,这就是工作(保存表单并重定向到页面“/post/name this post/”),但当发生错误时,您会被重定向,但不会显示错误。如何修复此问题?首先,将尝试将块包含到模板文件中:
{%用于表单%]中的字段
{{field.errors}}
{{field.label_tag}{{{field}}
{%endfor%}
其次,对于
重定向(反向('post',args=[request.post.get('url')),form=form)
,是否在views.py
处的exist viewpost
?除了在url.py
的urlpatterns的url(…)
条目中存在post
视图的urlpatterns
?如果两者都存在,则将其添加到问题代码中1。当我使用标准表单标签时,所有方法都包括在内(错误、标签等)。是的,def post存在,但是这个定义只响应post名称、内容等。我想构建一个表单标签。评级表在网站上非常常见,我不想提出任何意见。
# -*- 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)
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}