Работа с моделями


Практикум по работе моделями.
Включает уроки 14 и 33 плана 1.
Описание выполнения уроков смотри на закладке Код.

Вывод всех записей:

НомерТемаТип обращенияОписаниеДата добавления
3Проблема 3Пожелание Описание проблемы 312 сентября 2015 г. 15:19
2Проблема 2Ошибка Описание проблемы 212 сентября 2015 г. 15:18
1Проблема 1Консультация Описание проблемы 112 сентября 2015 г. 15:18

Последние 2 записи:

3Проблема 3Пожелание Описание проблемы 312 сентября 2015 г. 15:19
2Проблема 2Ошибка Описание проблемы 212 сентября 2015 г. 15:18

Только одна запись по Id=2:

2Проблема 2Ошибка Описание проблемы 212 сентября 2015 г. 15:18

Модуль models.py

# coding: utf-8
from django.db import models

class Incident(models.Model):  # Обращения
    class Meta:
        db_table = 'app_info_incidents'
        ordering = ['-date']

    # Перечисление типов обращений
    INCIDENT_TYPES = (
        ('CN', 'Консультация'),
        ('ER', 'Ошибка'),
        ('SG', 'Пожелание'),
    )
    # Описание модели
    number = models.IntegerField(verbose_name='Номер', default=0, unique=True)
    subject = models.CharField(verbose_name='Тема', max_length=200)
    description = models.TextField(verbose_name='Описание', blank=True,
                                   help_text='Если тема понятна, описание можно не указывать.')
    date = models.DateTimeField(verbose_name='Добавлено')
    type = models.CharField(verbose_name='Тип обращения', max_length=2,
                            default='CN', choices=INCIDENT_TYPES)

    def __unicode__(self):
        return u'{0} {1} {2}'.format(self.number, self.subject, self.date)

26.10.2015 Выполнил домашнее задание 33 урока
Легенда: Пользователи обращаются в службу поддержки. Все обращения пользователей фиксируются операторами. У всех полей обращений должны быть понятные русские заголовки. У всех обращений должны быть уникальные номера. Обращения у операторов должны отображаться в порядке убывания даты поступления. Обращения делятся на 3 типа: консультация, ошибка и пожелание. Оператор может указать суть обращения в теме, если она понятна и не указывать описание.
Выполненные изменения в модели:

  • для всех полей добавил понятные заголовки с помощью свойства verbose_name
  • добавил в поле number признак unique=True, чтобы контролировалась уникальность номеров обращений
  • в класс Meta добавил порядок по дате - ordering = ['-date'], чтобы обращения отображались в нужном порядке
  • добавил перечисление INCIDENT_TYPES, для определения типов обращений
  • добавил поле type с выбором значения перечисления INCIDENT_TYPES, для указания типа обращения в обращении
  • добавил default='CN' в поле type для установки значения типа обращения по умолчанию
  • добавил для поля description признак blank=True, чтобы можно было не заполнять это поле при понятной теме обращения
  • добавил для поля description признак help_text, чтобы операторам отображалась подсказка про то, что описание можно не указывать при понятной теме

сlass Incident(models.Model):  # Инцидент
    class Meta:
        db_table = 'app_info_incidents'

    # Описание модели
    number = models.IntegerField()
    subject = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    date = models.DateTimeField()

24.10.2015 После 30 урока убрал из поля description признак null=True

class Incident(models.Model):  # Инцидент
    class Meta:
        db_table = 'app_info_incidents'

    # Описание модели
    number = models.IntegerField(default=0)
    subject = models.CharField(max_length=200)
    description = models.TextField(blank=True, null=True)
    date = models.DateTimeField()

Модуль views.py

# coding: utf-8
from django.shortcuts import render_to_response
from info.models import Incident

def help(request): # Работа с моделями
    # Модель.менеджер.что_вывести()
    incidents = Incident.objects.all()
    last2 = Incident.objects.order_by('-date')[0:2]
    record2 = Incident.objects.get(id=2)
    return render_to_response('help.html', {'incidents': incidents, 'last2': last2, 'record2': record2})

Модуль urls.py

# coding: utf-8
from django.conf.urls import url
import info.views as views

urlpatterns = [
    url(r'^help/$', views.help),
]

Шаблон help.html

{% extends 'base.html' %}
{% block content %}
Практикум по работе моделями.<br>
Включает уроки 14 и 33 плана 1.<br>
Описание выполнения уроков смотри на закладке <strong>Код</strong>.<br>
<h4>Вывод всех записей:</h4>
<table class="table table-bordered">
    <tr><th>Номер</th><th>Тема</th><th>Тип обращения</th><th>Описание</th><th>Дата добавления</th></tr>
{% for incident in incidents %}
    <tr><td>{{ incident.number }}</td><td>{{ incident.subject }}</td><td>{{ incident.get_type_display }}</td>
    <td>{{ incident.description }}</td><td>{{ incident.date }}</td></tr>
{% endfor %}
</table>
<h4>Последние 2 записи:</h4>
<table class="table table-bordered">
{% for last in last2 %}
    <tr><td>{{ last.number }}</td><td>{{ last.subject }}</td><td>{{ last.get_type_display }}</td>
    <td>{{ last.description }}</td><td>{{ last.date }}</td></tr>
{% endfor %}
</table>
<h4>Только одна запись по Id=2:</h4>
<table class="table table-bordered">
    <tr><td>{{ record2.number }}</td><td>{{ record2.subject }}</td><td>{{ record2.get_type_display }}</td>
    <td>{{ record2.description }}</td><td>{{ record2.date }}</td></tr>
</table>
{% endblock %}

26.10.2015 Изменения в шаблоне:

  • cделал более понятное описание заголовка, т.к. скорее всего эта страница мне еще понадобится для выполнения практикумов по моделям
  • добавил колонку "Тип обращения" для вывода типа обращения. Для этого использовал функцию get_type_display, которая автоматически создала Django при добавлении поля с признаком choices

Модуль admin.py

# coding: utf-8
from django.contrib import admin
from info.models import Incident

class IncidentAdmin(admin.ModelAdmin):
    list_display = ('number', 'date', 'subject', 'type', 'description')

admin.site.register(Incident, IncidentAdmin)

26.10.2015 Добавил в отображаемую таблицу обращений все поля, которые по легенде должны видеть операторы. Для этого использовал свойство класса list_display, в котором в кортеже указаны выводимые поля.

# coding: utf-8
from django.contrib import admin
from info.models import Incident

admin.site.register(Incident)

blog comments powered by Disqus