这是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
单击“提交”后,编译器将按照说明抛出错误。我的问题是,这是什么错误,我如何找到方法?
答案 0 :(得分:0)
add_page()
有两个参数:request
,由Django自动提供,category_name
,您必须提供(并且您不是。)
答案 1 :(得分:0)
您有两个名为&#34; add_page&#34;的网址。第一个不包含category_name
参数,而第二个参数不包括{{1}}。你要去第一个。