Python 接收到如下错误-IntegrityError位于/rango/category/Django/add_page/NOT NULL约束失败:rango_page.category_id

Python 接收到如下错误-IntegrityError位于/rango/category/Django/add_page/NOT NULL约束失败:rango_page.category_id,python,django,url,django-views,django-urls,Python,Django,Url,Django Views,Django Urls,这是views.py from django.shortcuts import render from .models import Category , Page from .forms import CategoryForm , PageForm from django.http import HttpResponse # Create your views here. def index(request): cat_list = Category.objects.all()

这是views.py

from django.shortcuts import render
from .models import Category , Page
from .forms import CategoryForm , PageForm
from django.http import HttpResponse

# Create your views here.

def index(request):
    cat_list = Category.objects.all()
    context_dict = {'boldmessage':'This motherfuckers bold from the context' , 'categories':cat_list}
    return render(request , 'rango/index.html', context_dict)

def about(request):
    context_dict = {'Hoopdedoopdedoop':'About bitch'}
    return render(request , 'rango/about.html' , context_dict)

def category(request , category_name_url):
    print("-"*50)
    print(category_name_url)
    category_name = category_name_url.replace('_' , '')
    context_dict = {'category_name':category_name}
    try:
        category = Category.objects.get(name = category_name)
        pages = Page.objects.filter(category = category)    #Retrieving all the associated pages
        context_dict['pages'] = pages
        context_dict['category'] = category
    except Category.DoesNotExist:
        pass
    return render(request , 'rango/category.html' , context_dict)

def add_category(request):
    print("Yup Beginning")
    # If it is an HTTP request
    if request.method == 'POST':
        #Creating a form instance and populating it with data from the request
        form = CategoryForm(request.POST)

        #If the form is valid
        if form.is_valid():
            #Saving the category to the form
            form.save(commit = True)

            #Now calling the index view like the page
            return index(request)
        else:
            #If the supplied form contained errors and printing them to the terminal
            print(form.errors)
    else:
        #If the request was not a POST, display the form to enter details
        form = CategoryForm()
    context_dict = {'form':form}
    return render(request , 'rango/add_category.html' , context_dict)

def add_page(request , category_name):
    print("-"*60)
    print(category_name)
    try:
        cat = Category.objects.get(name = category_name)
    except Category.DoesNotExist:
        cat = None

    if request.method == 'POST':
        form = PageForm(request.POST)

        if form.is_valid():
            if cat:
                page = form.save(commit = True)
                page.category = cat
                page.views = 0
                page.save()
                return category(request , category_name)
        else:
            print(form.errors)
    else:
        form = PageForm()
    context_dict = {'form':form}
    return render(request , 'rango/add_page.html' , context_dict)
这是URL.py

from django.conf.urls import patterns , url
from .import views

urlpatterns = [
    url(r'^$' , views.index , name = 'index' ) ,
    url(r'^about/' , views.about , name = 'about' ) ,
    url(r'^category/(?P<category_name_url>\w+)/$' , views.category , name = 'category'),
    url(r'^add_category/', views.add_category, name = 'add_category'),
    url(r'add_page/' , views.add_page , name = 'add_page'),
    url(r'category/(?P<category_name>\w+)/add_page/$' , views.add_page , name = 'add_page'),
]
Models.py-

from django.db import models

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length = 128 , unique = True)
    views = models.IntegerField(default = 0)
    likes = models.IntegerField(default = 0)

    def __str__(self):
        return self.name

class Page(models.Model):
    category = models.ForeignKey(Category)
    #Foreign key is a one-to-,any relationship. Over here it means one Page is related to several Categories
    title = models.CharField(max_length = 128)
    url = models.URLField()
    views = models.IntegerField(default = 0)

    def __str__(self):
        return self.title
添加页面模板-

<html>
    <head>
        <title>Rango</title>
    </head>

    <body>
        <h1>Add a Page</h1>
        <form id="Category Form" method="post" action="/rango/category/{{ category_name }}/add_page/">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" name="submit" value="create page">
        </form>
    <a href="/rango/">Home</a>
    </body>
</html>
单击“提交”后,编译器将抛出一个错误,如前所述。我这里的问题是,这是什么错误?我如何找到解决方法?

add\u page()
有两个参数:
request
,由Django自动提供;以及
category\u name
,您必须提供(而不是)。

您有两个名为“add\u page”的URL。第一个参数不包括
category\u name
参数,而第二个参数包括。你要去第一个

<html>
    <head>
        <title>Rango</title>
    </head>

    <body>
        <h1>Add a Page</h1>
        <form id="Category Form" method="post" action="/rango/category/{{ category_name }}/add_page/">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" name="submit" value="create page">
        </form>
    <a href="/rango/">Home</a>
    </body>
</html>
IntegrityError at /rango/category/Django/add_page/

NOT NULL constraint failed: rango_page.category_id

Request Method:     POST
Request URL:    http://127.0.0.1:8000/rango/category/Django/add_page/
Django Version:     1.9.2
Exception Type:     IntegrityError
Exception Value:    

NOT NULL constraint failed: rango_page.category_id

Exception Location:     C:\Python35-32\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 323
Python Executable:  C:\Python35-32\python.exe
Python Version:     3.5.1
Python Path:    

['C:\\NOS\\Coding\\Django\\tango_with_django_project',
 'C:\\NOS\\Coding\\Django\\tango_with_django_project',
 'C:\\Python35-32\\python35.zip',
 'C:\\Python35-32\\DLLs',
 'C:\\Python35-32\\lib',
 'C:\\Python35-32',
 'C:\\Python35-32\\lib\\site-packages']

Server time:    Sat, 6 Feb 2016 23:48:51 +0530