ть батьківський клас. Метод get_context_data буде спрацьовувати при GET запиті, і виводити дві форми (для створення новини і завантаження документа). Так само в кожній view ми будемо встановлювати перевірку: (self.request.user.is_authenticated ()) and (Profile.objects.get (pk=self.request.user.id) .party == True) and (not pk in self.kwargs)
Цей фрагмент визначать, чи зареєстрований поточний користувач, активований він адміністратором і чи перебуває на своїй сторінці або на сторінці іншого користувача.
Рисунок 10 - Головна сторінка користувача
Форми для створення новини BlogForm і для завантаження файлу FileForm опишемо в тій же директорії у файлі forms.py.
Першу форму вкажемо як стандартний атрибут батьківського класу form_class. І при спрацьовуванні POST запиту, ця форма буде оброблятися стандартними методами CreateView. Що б не прописувати багато зайвих полів у формі BlogForm, ми будемо використовувати клас ModelForm, який вкаже що форма буде успадковуватися від моделі Blog, за допомогою атрибуту model, і атрибуту exclude вкажемо які поля ми не хочемо змінювати.
class BlogForm (forms. ModelForm): Meta:=Blog=( number raquo ;, author raquo ;, date_of_publication raquo ;, image raquo ;, tags )=forms. FileField (max_length=200, label=«Обкладинка новини», required=False)
Т. к. нам потрібно що б користувач не бачив технічні поля (такі як author, date_of_publication, number, поле tags являє собою посилання на об'єкти (ManyToManyField), поле image - FileBrowserField не надає функціонал завантаження файлу на станиці сайту) то їх ми будемо обробляти і заповнювати вручну під час перевірки на валідність форми.
Що ж стосується другої форми, FileForm, то ми її будемо просто передавати в словнику context разом з іншими потрібними нам змінними, і обробка відбуватиметься за допомогою іншого класу UploadView, який буде успадковуватися від стандартного класу View, забезпечує метод post, який ми перевизначити.
class FileForm (forms. ModelForm): Meta:=FileProfile=( user raquo ;, date raquo ;, file )=forms. FileField (max_length=200, label="Файл", required=False)
Хочу зауважити, що при завантаженні картинки новини або документа для скачування, у формах використовувалося додатково поле FileField. Це пов'язано з тим, що функціонал поля FielBrowserField не дозволяє завантажувати файл на сторінці сайту, на відміну від стандартних Django-полів ImageField і FileField, яке описано у формі. Тому при виводі шаблон (файл * .html), ми приховуємо поле моделей Blog і FileProfile, а замість них вказуємо додаткове поле FileField. І вже при перевизначенні методу, ми з POST запиту отримуємо об'єкт файлу, зберігаємо його по потрібному нам шляхи та за допомогою методу FileObject, який імпортується з бібліотеки filebrowser, перетворимо його в об'єкт класу FileBrowserField.
Весь код даних сторінок представлено в додатку Б.
Додаток, що реалізує розділ БЛОГ, описується в папці blog нашого проекту. Головна сторінка цього розділу являє собою стрічку новин, з можливістю переглядати кожну новину повністю, формою пошуку за словами в тексті, заголовку і тегами новини, а також бічне меню, для фільтрації новин по архівах (малюнок 11).
Малюнок 11 - Головна сторінка новин
Функціонал головної сторінки новин здійснюється за допомогою класу ListView, якому передаємо в якості атрибута model модель Blog, що б вивести всі об'єкти даної моделі.
class BlogList (ListView):=Blog_object_name=«blog» get_context_data (self, ** kwargs):=super (BlogList, self) .get_context_data (** kwargs) self.request.user.is_authenticated () and Profile.objects.get (pk=self.request.user.id) .party == True: _obj=[] obj in Blog.objects.dates ( created raquo ;, month ): _ obj. append (obj)
[ archives ]=date_obj [ active_main_menu ]= main_blog :. template_name=«profile/error.html»
context [ ErrorText ]=u" Ви не авторизовані» context
Для перегляду кожної новини створюємо клас BlogDetail, а як батька класу будемо вказувати CreateView, що б була можливість створювати коментарі. Атрибуту model задаємо як об'єкт моделі Blog, вказуючи на основі якої моделі, ми будемо будувати форму, а в атрибуті exclude вкажемо які поля, ми не будемо відображати на шаблоні.
model=Comment=[ article raquo ;, author_name raquo ;, pub_date raquo ;, admin_comment ]
І тепер, що б при збереженні об'єкта наші виключені поля теж придбали потрібні нам значення, перевизначити метод form_valid: