Django实践:创建表单,debug--NoReverseMatch at /topics/1/和Page not found (404),分析与解决

Django实践:创建表单

创建表单步骤

  1. 在当前应用中添加一个新的forms.py,在里面创建表单,包括主题和条码项
from django import forms
from .models import Topic, Entry

class TopicForm(forms.ModelForm):
    class Meta:
        model = Topic
        fields = ['text']
        labels = {'text': ''}

class EntryForm(forms.ModelForm):
    class Meta:
        model = Entry
        fields = ['text']
        labels = {'text': ''}
        widgets = {'text': forms.Textarea(attrs={'cols': 80})}
  1. 映射URL,在urls.py中添加Topic和Entry的url模式
    # Page for adding a new topic.
    re_path('^new_topic/$', views.new_topic, name='new_topic'),

    # Page for adding a new entry.
    re_path('^new_entry/(?P<topic_id>\d+)/$', views.new_entry, name='new_entry'),
  1. 编写视图函数,在views.py中
from django.shortcuts import render
from django.http import HttpResponseRedirect, Http404
from django.urls import reverse

from .models import Topic, Entry
from .forms import TopicForm, EntryForm

def new_topic(request):
    """Add a new topic."""
    if request.method != 'POST':
        # No data submitted; create a blank form.
        form = TopicForm()
    else:
        # POST data submitted; process data.
        form = TopicForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topics'))

    context = {'form': form}
    return render(request, 'learning_logs/new_topic.html', context)


def new_entry(request, topic_id):
    """Add a new entry for a particular topic."""
    topic = Topic.objects.get(id=topic_id)

    if request.method != 'POST':
        # No data submitted; create a blank form.
        form = EntryForm()
    else:
        # POST data submitted; process data.
        form = EntryForm(data=request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topic',
                                                args=[topic_id]))

    # context = {'topic': topic, 'form': form, 'topic_id': topic_id}
    context = {'topic': topic, 'form': form}
    return render(request, 'learning_logs/new_entry.html', context)
  1. 新建new_topic的模板new_topic.html,并在topics.html中添加new_topic的链接
<a href="{% url 'learning_logs:new_topic'%}">Add a new Topic:</a>
  1. 新建new_entry的模板new_entry.html,并在topic.html中添加new_entry的链接
<a href="{% url 'learning_logs:new_entry' topic.id %}">Add a new Entry:</a>

debug

错误一:NoReverseMatch at /topics/1/

  Reverse for ‘new_entry’ with no arguments not found. 1 pattern(s) tried: [‘new_entry/(?P<topic_id>\d+)/$’]
在这里插入图片描述
  分析:反解析‘new_entry’时候未找到没有参数的‘new_entry’,因为views.py中的new_entry(request, topic_id)函数有另外的参数topic_id,说明在调用的时候没有将topic_id的参数传给views.py中的函数,也没有传给urls.py中的re_path()函数。
在这里插入图片描述
  解决:错误是在topic.html中,在向topic.html中添加new_entry页面链接的时候,未把topic_id参数传递给new_entry的re_path()函数和new_entry(request, topic_id)函数。

  错误代码如下:

<a href="{% url 'learning_logs:new_entry'%}">Add a new Entry:</a>

  修改后:

<a href="{% url 'learning_logs:new_entry' topic.id %}">Add a new Entry:</a>

错误二:Page not found (404)

  进入topic页面点击Add a new Entry链接时候,出现找不到页面的情况:
在这里插入图片描述
  分析:页面的链接不对
  解决:错误是在topic.html中,在%和}多了一个空格,导致超链接解析错误。
在这里插入图片描述
  错误代码如下:

<a href="{% url 'learning_logs:new_entry' topic.id % }">Add a new Entry:</a>

  修改后:

<a href="{% url 'learning_logs:new_entry' topic.id %}">Add a new Entry:</a>

参考文献

  1. 《Python编程从入门到实践》:https://ehmatthes.github.io/pcc/
  2. Django帮助文档:https://docs.djangoproject.com/zh-hans/2.0/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值