Привет всем!
В Django новичек, пытаюсь изучать, читаю мануалы и штудирую данный сайт. Имею непонятное для меня поведение Django, прошу опытных джанговодов помочь в решении проблемы. Использую Python 2.7.2, Django 1.4.8 и sqlite3, вот мой models.py:
# -*-coding: utf-8 -*-
from django.db import models
from django.forms import ModelForm
class Person(models.Model):
"""
Абстрактный класс описывает человека person
"""
first = models.CharField(max_length=20, verbose_name='Имя')
middle = models.CharField(max_length=40, verbose_name='Отчество')
last = models.CharField(max_length=40, verbose_name='Фамилия')
headshot = models.ImageField(verbose_name='Фото', upload_to='course', blank=True)
class Meta:
abstract = True
def __unicode__(self):
return "%s %s.%s." % (self.last, self.first[0], self.middle[0])
class Teacher(Person):
"""
Класс описывает таблицу преподаватели teacher в базе данных
"""
description = models.TextField(verbose_name='Описание', blank=True)
class Meta:
verbose_name = 'Преподаватель'
verbose_name_plural = 'преподаватели'
class Group(models.Model):
"""
Класс описывает таблицу группы group в базе данных
"""
name = models.CharField(max_length=10, verbose_name='Название группы')
class Meta:
verbose_name = 'Группа'
verbose_name_plural = 'групы'
def __unicode__(self):
return self.name
class Student(Person):
"""
Класс описывает таблицу студенты student в базе данных
"""
group = models.ForeignKey(Group, verbose_name='Группа')
class Meta:
verbose_name = 'Студент'
verbose_name_plural = 'студенты'
class Course(models.Model):
"""
Класс описывает таблицу языковых курсов course в базе данных
"""
title = models.CharField(max_length=50, verbose_name='Название курса')
date = models.DateField(verbose_name='Дата проведения курса')
time = models.TimeField(verbose_name='Время проведения курса')
teacher = models.ManyToManyField(Teacher, verbose_name='Преподаватель')
group = models.ForeignKey(Group, verbose_name='Группа')
class Meta:
verbose_name = 'Курс'
verbose_name_plural = 'курсы'
def __unicode__(self):
return self.title
файл views.py:
# -*- coding:utf-8 -*-
from course.models import Course, Group, Teacher, Student
from django.shortcuts import render_to_response, get_object_or_404
from task.settings import DJANGO_VERSION, PYTHON_VERSION
from datetime import date, timedelta
def home(request):
"""
Функция представления home отображающая основную страницу
"""
year = date.today().year
month = date.today().month
weekday = date.today().isoweekday()
firs_day_week = timedelta(days=(weekday - 1)).days + date.today().day
seven_day_week = timedelta(days=(7 - weekday)).days + date.today().day
#courses = Course.objects.filter(date__gte=date(year, month, firs_day_week),
# date__lte=date(year, month, seven_day_week)).order_by("date")
courses = Course.objects.all().order_by("date")
return render_to_response('index.html', {'courses': courses, 'pyver': PYTHON_VERSION, 'djver': DJANGO_VERSION})
def teacher_full_name(request, teacher_id):
"""
Функция представления teacher_full_name отображающая информацию о преподавателе курса
"""
teacher = get_object_or_404(Teacher, pk=teacher_id)
return render_to_response('teacher.html', {'teacher': teacher})
def students_list_of_group(request, group_id):
"""
Функция представления students_list_of_group отображающая студентов группы
"""
students = Student.objects.filter(group__eq=group_id).order_by("last")
return render_to_response('students.html', {'students': students})
def add_course(request):
"""
Функция представления add_course для добавления курса
"""
return render_to_response('addcourse.html', {'course_title': 'New course'})
def del_course(request, course_id):
"""
Функция представления del_course для удаления курса
"""
c = get_object_or_404(Course, pk=course_id)
course_title = c.title
c.delete()
return render_to_response('delcourse.html', {'course_title': course_title})
def edit_course(request, course_id):
"""
Функция представления edit_course для редактирования курса
"""
return render_to_response('editcourse.html', {'course_id': course_id})
файл urls.py приложения:
from django.conf.urls import patterns, url
urlpatterns = patterns('course.views',
url(r'^$', 'home', name='home'),
url(r'^teacher/(?P<teacher_id>\d+)/$', 'teacher_full_name', name='teacher'),
url(r'^group/(?P<group_id>\d+)/$', 'students_list_of_group', name='students'),
url(r'^edit/(?P<course_id>\d+)/$', 'edit_course', name='edit'),
url(r'^add/$', 'add_course', name='add'),
url(r'^delete/(?P<course_id>\d+)/$', 'del_course', name='delete'),
)
и файл urls.py проекта:
from django.conf.urls import patterns, include, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', 'course.views.home', name='home'),
url(r'^course/', include('course.urls', namespace='lessons')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
urlpatterns += staticfiles_urlpatterns()
а это шаблон главной страницы index.html:
{% extends "base.html" %}
{% load url from future %}
{% load staticfiles %}
{% block content %}
<h2>Расписание курсов на текущую неделю</h2>
<table>
<tr>
<th>Курс</th>
<th>Дата</th>
<th>Время</th>
<th>Преподаватель</th>
<th>Группа</th>
</tr>
{% for course in courses %}
<tr>
<td>
{{ course.title }}
<a href="{% url 'lessons:edit' course.id %}"
onclick="return hs.htmlExpand(this, { objectType: 'ajax', headingText: 'Редактирование курса' })"
title="Изменить курс"><img src="{% static 'images/edit.png' %}" alt="Изменить курс"></a>
<a href="{% url 'lessons:delete' course.id %}"
onclick="return hs.htmlExpand(this, { objectType: 'ajax', headingText: 'Удаление курса' })"
title="Удалить курс"><img src="{% static 'images/delete.png' %}" alt="Удалить курс"></a>
</td>
<td>{{ course.date|date:"d.m.Y" }}</td>
<td>{{ course.time|date:"H:i" }}</td>
<td>
{% for teacher in course.teacher.all %}
{{ teacher }}
<a href="{% url 'lessons:teacher' teacher.id %}"
onclick="return hs.htmlExpand(this, { objectType: 'ajax', headingText: 'О преподавателе' })"
title="О преподавателе"><img src="{% static 'images/info.png' %}" alt="О преподавателе"></a>
{% endfor %}
</td>
<td>
{{ course.group }}
<a href="{% url 'lessons:students' group.id %}"
onclick="return hs.htmlExpand(this, { objectType: 'ajax', headingText: 'Студенты группы' })"
title="Студенты группы"><img src="{% static 'images/info.png' %}" alt="Студенты группы"></a>
</td>
</tr>
{% endfor %}
</table>
<br>
<div align="center">
<a href="{% url 'lessons:add' %}"
onclick="return hs.htmlExpand(this, { objectType: 'ajax', headingText: 'Добавление курса' })"
title="Добавить курс"><img src="{% static 'images/add.png' %}" alt="Добавить курс"></a>
</div>
{% endblock %}
{% block version %}
Python {{ pyver }} + Django {{ djver }}
{% endblock %}
При открытии главной страницы получаю ошибку на строку {% url 'lessons:students' group.id %}:
NoReverseMatch at /
Reverse for 'students' with arguments '('',)' and keyword arguments '{}' not found.
Если убрать эту строку и оставить пустой ссылку, то страница нормально открывается, но при обновлении или нажатии на любую ссылку-кнопку все данные из таблицы course удаляются, во всех других таблицах данные не тронуты. В чем проблема ткните носом в ошибку, не могу разобраться?