我对MVC和MTV概念有点新意,我正在尝试学习Python Django。我想用书制作目录,必须有添加和删除功能。我正在尝试遵循最佳实践并使用Generic视图,但有点卡在最后,我觉得我错过了一些非常小的东西,但我无法弄明白 - 说实话我现在非常疲惫而且我没有很多时间。所以这是我的代码: 机型:
class Books(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=200)
isbn = models.CharField(max_length=200)
pages = models.IntegerField(default=0)
def __unicode__(self):
return self.title
class BooksForm(ModelForm):
class Meta:
model = Books
查看:
# coding: utf-8
from django.core.urlresolvers import reverse_lazy
from django.views.generic import ListView, UpdateView, CreateView, DetailView
from models import Book
class BooksDetailView(DetailView):
model = Book
template_name = "books_portal/details.html"
class BooksCreateView(CreateView):
model = Book
template_name = "books_portal/add.html"
success_url = reverse_lazy('books_portal')
class BooksUpdateView(UpdateView):
model = Book
template_name = "books_portal/add.html"
success_url = reverse_lazy('books_portal')
class BooksListView(ListView):
model = Book
context_object_name = 'books_list'
template_name = "books_portal/index.html"
def get_queryset(self):
return Book.objects.order_by('author')[:5]
模板: add.html
{% extends "books_portal/base.html" %}
{% block title %}Add books{% endblock %}
{% block extracss %}
<style>
.top-buffer { margin-top:20px; }
.bs-docs-nav { background-color: #563d7c; }
</style>
{% endblock extracss %}
{% block content %}
<form action="" method="post" class="form-horizontal" role="form">{% csrf_token %}
<div class="row top-buffer">
<div class="col-md-1">
{{form.title.label_tag}}
<input type="text" value="" class=""/>
</div>
</div>
<div class="row top-buffer">
<div class="col-md-1">
{{form.author.label_tag}}
<input type="text" value="" class=""/>
</div>
</div>
<div class="row top-buffer">
<div class="col-md-2 col-md-offset-1">
<input type="submit" value="Save" class="btn btn-primary btn-lg"/>
</div>
</div>
</form>
{% endblock %}
base.html文件
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{{title|default:"Book Library"}}{% endblock %}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
{% block extracss %}{% endblock extracss %}
</head>
<body>
<div class="container">
<div class="navbar-header">
<a href="{% url 'books_portal' %}" class="navbar-brand">Books Portal</a>
</div>
{% block content %}
{% endblock %}
</div>
{% block extrajs %}{% endblock extrajs %}
</body>
</html>
details.html
{% extends "books_portal/base.html" %}
{% block title %}Details{% endblock %}
{% block extracss %}
<style>
.top-buffer { margin-top:20px; }
.bs-docs-nav { background-color: #4CD085; }
</style>
{% endblock extracss %}
{% block content %}
<div class="row top-buffer">
<div class="col-md-1">
<strong>Title:</strong>
</div>
<div class="col-md-2">
{{book.title}}
</div>
</div>
<div class="row top-buffer">
<div class="col-md-1">
<strong>Author:</strong>
</div>
<div class="col-md-2">
{{book.author}}
</div>
</div>
<div class="row top-buffer">
</div>
<div class="row">
<div class="col-md-1 col-md-offset-1 text-center"><a href="{% url 'books_portal' %}" class="btn btn-primary btn-lg">OK</a></div>
</div>
{% endblock %}
的index.html
{% extends "books_portal/base.html" %}
{% block title %}Collection of books{% endblock %}
{% block extracss %}
<style>
.top-buffer { margin-top:20px; }
.bs-docs-nav { background-color: #563d7c; }
</style>
{% endblock extracss %}
{% block content %}
<table class="table table table-hover">
<tr>
<th class="text-center">Title</th>
<th class="text-center">Author</th>
<th class="text-center">Edit</th>
</tr>
{% for book in books_list %}
<tr>
<td class="text-center"><a href="{% url 'books_details' pk=book.id%}">{{ book.title }}</a></td>
<td class="text-center">{{ book.author }}</td>
<td class="text-center"><a href="{% url 'books_edit' pk=book.id%}" class="btn btn-default">Delete</a></td>
</tr>
{% endfor %}
</table>
<div class="row">
<div class="col-md-2 col-md-offset-5 text-center"><a href="{% url 'books_add' %}" class="btn btn-primary btn-lg">Add</a></div>
</div>
{% endblock %}
目前我无法添加或删除任何书籍,任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
我已将所有代码以及相关的urls.py剪切并粘贴到新项目中。当前的问题是您没有在add.html中显示任何表单错误。您只需在模板顶部添加{{ form.errors }}
即可。
完成后,您会看到实际问题:您在创建图书时未提供所有相关字段。事实上,Django无法看到任何字段,因为您没有给出任何输入name
属性。实际上,你不应该手动创建input
元素:你应该让Django这样做,因为它还负责在重新显示有错误的表单时,或者当使用现有值预先填充字段时编辑现有的书。它应该是这样的:
{{ form.title.label_tag }}
{{ form.title }}
{{ form.title.errors }}
然后,未解决的问题是您未包含模型根据需要处理的isbn
或pages
字段。您可以在模型中将它们设置为blank=False
,也可以在ModelForm中使用exclude
列表。无论哪种方式,null=False
的模型字段中都需要pages
。
或者,当然,您可以将它们添加到表单中。说实话,在您学习的时候,现在最容易做的就是用<form>
替换{{ form.as_p }}
标签内的所有HTML,以便Django为您输出所有内容。< / p>