Python Django的MTV新手问题

时间:2013-12-09 08:30:04

标签: python django

我对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 %}

目前我无法添加或删除任何书籍,任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我已将所有代码以及相关的urls.py剪切并粘贴到新项目中。当前的问题是您没有在add.html中显示任何表单错误。您只需在模板顶部添加{{ form.errors }}即可。

完成后,您会看到实际问题:您在创建图书时未提供所有相关字段。事实上,Django无法看到任何字段,因为您没有给出任何输入name属性。实际上,你不应该手动创建input元素:你应该让Django这样做,因为它还负责在重新显示有错误的表单时,或者当使用现有值预先填充字段时编辑现有的书。它应该是这样的:

{{ form.title.label_tag }}
{{ form.title }}
{{ form.title.errors }}

然后,未解决的问题是您未包含模型根据需要处理的isbnpages字段。您可以在模型中将它们设置为blank=False,也可以在ModelForm中使用exclude列表。无论哪种方式,null=False的模型字段中都需要pages

或者,当然,您可以将它们添加到表单中。说实话,在您学习的时候,现在最容易做的就是用<form>替换{{ form.as_p }}标签内的所有HTML,以便Django为您输出所有内容。< / p>