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

时间:2016-02-06 17:46:26

标签: 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()
    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)

这是urls.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'),
]

Forms.py -

#In forms.py module, I create a number of classes that inherit from django's ModelClass.
#The ModelForm is a helper class that allows me to create a django form from an existing django model.
#Now I create ModelForms for the already defined Page and Category models.

from django import forms
from .models import Category , Page

class CategoryForm(forms.ModelForm):
    name = forms.CharField(max_length = 128 , help_text = "Please enter the category name.")
    views = forms.IntegerField(widget = forms.HiddenInput() , initial = 0)
    likes = forms.IntegerField(widget = forms.HiddenInput() , initial = 0)

    #To provide additional information on the form
    class Meta:
        #To provide an association between the ModelForm and a model
        model = Category

        #This refers to the fields we wanna include in the form
        fields = ('name',)

class PageForm(forms.ModelForm):
    title = forms.CharField(max_length = 128 , help_text = "Enter the title of the page.")
    url = forms.CharField(max_length = 128 , help_text = "Enter the URL of the page.")
    views = forms.IntegerField(widget = forms.HiddenInput() , initial = 0)

    def clean(self):
        cleaned_data = self.cleaned_data
        url = cleaned_data.get('url')

        if url and not url.startswith('http://'):
            url = 'http://' + url
            cleaned_data['url'] = url
        return cleaned_data

    #To provide additional information on the form
    class Meta:
        #To provide an association between the ModelForm and a model
        model = Page

        #These refer to the fields we wanna include in the form
        fields = ('title' , 'url' , 'views')

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

add_page template -

<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  

单击“提交”后,编译器将按照说明抛出错误。我的问题是,这是什么错误,我如何找到方法?

2 个答案:

答案 0 :(得分:0)

add_page()有两个参数:request,由Django自动提供,category_name,您必须提供(并且您不是。)

答案 1 :(得分:0)

您有两个名为&#34; add_page&#34;的网址。第一个不包含category_name参数,而第二个参数不包括{{1}}。你要去第一个。