Tango与Django教程:表单
我正在做第7章的练习,要求我在每个分类页面上创建一个“添加页面”的链接,这样用户点击后就能进入一个新页面,在那里可以输入名称和网址,以便添加到特定的分类。如果该分类不存在,用户会被重定向到添加分类的页面。
所以步骤是:
1. 创建一个新的视图(教程中已经给我们准备好了这个视图)
def add_page(request, category_name_url):
context = RequestContext(request)
category_name = category_name_url.replace('_',' ')
if request.method == 'POST':
form = PageForm(request.POST)
if form.is_valid():
page = form.save(commit = False)
try:
cat = Category.objects.get(name = category_name)
page.category = cat
except Category.DoesNotExist:
return render_to_response('blog/add_category.html', {} , context)
page.views = 0
page.save()
return category(request, category_name_url)
else:
print form.errors
else:
form = PageForm()
return render_to_response('blog/add_page.html', {'category_name_url': category_name_url, 'category_name': category_name, 'form': form}, context)
2. 创建一个新的模板
<!DOCTYPE html>
<html>
<head>
<title> Drib </title>
</head>
<body>
<h1>Add Page</h1>
<form id = 'page_form' method = 'post' action = '/blog/add_page/'>
{% csrf_token %}
{%for hidden in forms.hidden_fields%}
{{hidden}}
{%for field in forms.visible_fields%}
{{field}}
{{field.errors}}
{{field.help_text}}
<input type = 'submit' name='Submit' value = "Add Page" />
</form>
</body>
</html>
3. URL映射
url(r'^category/(?P<category_name_url>\w+)/add_page/$', views.add_page , name = 'add_page')
4. 从分类页面创建一个链接(我只会贴出链接,因为没有必要贴出整个文件...)
<a href="/blog/category/{{category_name_url}}/add_page/"> Add Page</a>
教程中的提示是:
- 更新category()视图,将category_name_url插入到视图的context_dict字典中 - 完成
- 更新category.html,添加一个指向/rango/category//add_page/的链接。确保这个链接只有在请求的分类存在时才会出现,无论是否有页面。- 我相信我在第4步做到了这一点(不过不太确定)
- 更新rango/urls.py,添加一个URL映射来处理上面的链接。(我认为这是第3步)
我的问题是,为什么点击“添加页面”后我得到的是
http://127.0.0.1:8000/blog/category/Python/blog/category/Python/add_page/
而不是
http://127.0.0.1:8000/blog/category/Python/add_page/
2 个回答
1
要真正添加页面,你可以把
1
这是因为
<a href="blog/category/{{category_name_url}}/add_page/"> Add Page</a>
是一个相对链接。这意味着它的链接地址是基于你当前的路径来拼接的。
如果想把它变成绝对路径,只需要在前面加一个 /,这样就变成了:
<a href="/blog/category/{{category_name_url}}/add_page/"> Add Page</a>
^ Here's the leading slash