Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Логическая часть приложения и отображение данных на страницах




 

Теперь приступим к реализации функционала наших страниц.

Главная страница сайта будет представлять собой страницу профиля пользователя, где будут размещены его контактные данные, новостную ленту текущего пользователя, с возможностью добавлять новые новости, и форму для выкладывания документов и список для их скачивания (рисунок 10).

Для этого создадим класс ProfileView, который будет наследоваться от класса CreateView. Но в связи с тем, что на странице будет выполняться множество действий, необходимо поменять поведение view, которые описывают родительский класс. Метод 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', 'author', 'date_of_publication', 'image', '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', 'date', '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', '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', 'author_name', 'pub_date', 'admin_comment']


И теперь, что бы при сохранении объекта наши исключенные поля тоже приобрели нужные нам значения, переопределим метод form_valid:

 

def form_valid (self, form):= form.save (commit=False).article = Blog.objects.get (pk=self.kwargs['pk']).author_name = self.request.user.username.pub_date = datetime.datetime.now().save()redirect (self.get_absolute_url())get_absolute_url(self):reverse («blog_detail», kwargs={«pk»: self.kwargs['pk']})

 

Для того что бы наши объекты модели Blog фильтровались по датам указанным в боковом меню, используем класс MonthArchiveView. Этот класс обладает атрибутом date_field, принимающего название поле типа DateTimeField в виде строки, по которому будем фильтровать объекты. При этом в url будут предаваться два параметра - month, year, которые соответствуют месяцу и году указанным в ссылке.

 


Заключение

 

В дипломной работе с помощью Class-Base-View разработано приложение, являющееся корпоративной сетью для организации ККМОО «Молодежная лига развития национальных культур Кубани», сгенерирована база данных в PostgeSQL на основе полей описанных в моделях проекта, c помощью модуля south. Приложение осуществляет обмен сообщениями, поиск, добавление и удаления других пользователей в друзья, новостной блог, с возможностью комментирования каждой статьи и личную страницу пользователя, содержащую личную ленту новостей, список документов для скачивания и контактную информацию пользователя.

Приложение будет полезно для крупных фирм, которым необходим постоянный и быстрый обмен информации, при этом минимизируя утечку информации за пределы данного сообщества. Разработанный проект представляет собой Сайт-под-ключ, так как обладает оптимизированной и при этом функциональной административной частью, которой может управлять обычный компьютерный пользователь, что позволяет владельцу сайта не нанимать постоянного администратора.

Планируется дальнейшее развитие проекта - добавление фото- и видео - галереи, а также, с помощью API Яндекс.translate и API Яндекс. Карты, добавить перевод всего сайта и размещения на изображении местности различных графических объектов.

Следовательно, приложение не утратит актуальности и будет в дальнейшем гораздо полезнее.

Весь проект написан на языке Python.

 


Список используемой литературы

1 Django 1.5 documentation [Электронный ресурс] // Django 1.5 documentation. URL: https://docs.djangoproject.com/en/1.5/. (Дата обращения: 1.09.2013)

Форсье, Дж. Django. Разработка веб-приложений на Python./ Дж. Форсье, П. Биссекс, У. Чан, - СПб.: Символ-Плюс, 2010. - 456 с.

Лутц М. Программирование на Python, том ӏ- ӏ ӏ, 4-е издание/ М. Лутц - СПб.: Символ-Плюс, 2011. - 922 с.

Бизли, Д. Python. Подробный справочник, 4-е издание/ Д. Бизли - М.: Символ-Плюс, 2010. - 326 с.

5 Object-Relational Mapping! [Электронный ресурс] // ORM. URL: http://ru.wikipedia.org/wiki/ORM. (Дата обращения: 12.03.2012).

Django [Электронный ресурс] // Django. URL: http://ru.wikipedia.org/wiki/Django. (Дата обращения: 2.09.2013)

Buter-Brod [Электронный ресурс] // Представляем корпоративную сеть asmallworld.net для богатых и знаменитых. URL: http://buter-brot.ru/Moda/prdedstavlyaem-soczialnuyu-set-asmallworldnet-dlya-bogatyx-i-znamenityx.html/. (Дата обращения: 4.04.2014).

ASmallWorld. Корпоративная сеть [Электронный ресурс] // URL: https://www.asmallworld.com/. (Дата обращения: 4.30.2014).

Adamant [Электронный ресурс] // Оператор системных решений. URL: http://www.adamant.ua/projects/corporate-network/. (Дата обращения: 4.04.2014).

 


Приложение A

 

Файл manage.py

#!/ usr / bin / env python

from django.core.management import execute_managerimp

:.find_module('settings') # Assumed to be in the same directory. ImportError:sys.stderr.write («Error: Can't find the file 'settings.py' in the directory containing % r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n»% __file__).exit(1)

settings

__name__ == «__main__»:_manager(settings)

 

 


Приложение Б

 

Папка settings:

Файл __init.py__ (содержит все настройки Django):

# -* - encoding: utf -8 -*- os, sysdjango.contrib import messagesdjango.utils.translation import ugettext_lazy as _os.path= True_ROOT = os.path.realpath (os.path.join (os.path.dirname (__file__),»../.»))= lambda p: os.path.join (PROJECT_ROOT, p)_DEBUG = DEBUG= ADMINS_BACKEND = 'django.core.mail.backends.filebased. EmailBackend'_FILE_PATH = os.path.join (PROJECT_ROOT, '_emails')_HOST = ' localhost '_PORT = '8000'_HOST_USER = ''_HOST_PASSWORD = ''_USE_TLS = True= {

'default': {

'ENGINE': 'django.db.backends.postgresql_psycopg2', # mysql ',

'NAME': ' diplom ',

'USER': ' postgres ',

'PASSWORD': ' postgres ',

'HOST': '127.0.0.1',

'PORT': '5432',

}

}_HOSTS = []_ZONE = 'Europe/ Moscow '_CODE = ' ru - ru '_ID = 1_I18N = True_L10N = True_TZ = True_PATHS = (os.path.join (PROJECT_ROOT, 'locale'),)_ROOT = os.path.join (PROJECT_ROOT, 'private/media/')_URL = '/media/'_ROOT = os.path.join (PROJECT_ROOT, 'public/static/')_URL = '/static/'_MEDIA_PREFIX = '/static/ admin /'_DIRS = (.path.join (PROJECT_ROOT, ' diplom /static/'),

)

 

_HOST = ' www.example.com '_FINDERS = (

'django.contrib.staticfiles.finders. FileSystemFinder',

'django.contrib.staticfiles.finders. AppDirectoriesFinder',

)_KEY = '_z (8gb-k+c^y5^1r3b02^km64ve0) bja % soa3@a23d5@* geodf '_DEBUG = DEBUG_CONTEXT_PROCESSORS = (

'django.core.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.core.context_processors.debug',

'django.core.context_processors.i18n',

'django.core.context_processors.media',

'django.core.context_processors.static',

'django.core.context_processors.tz',

'django.contrib.messages.context_processors.messages',

)_LOADERS = (

'django.template.loaders.filesystem. Loader',

'django.template.loaders.app_directories. Loader',

'django.template.loaders.eggs. Loader',

)_DIRS = (.path.join (PROJECT_ROOT, 'templates/'),

)

«» «Middleware related settings.»"»_CLASSES = (

'django.middleware.common. CommonMiddleware',

'django.contrib.sessions.middleware. SessionMiddleware',

'django.middleware.locale. LocaleMiddleware',

'django.middleware.csrf. CsrfViewMiddleware',

'django.contrib.auth.middleware. AuthenticationMiddleware',

'django.contrib.messages.middleware. MessageMiddleware',

'django.middleware.clickjacking.XFrameOptionsMiddleware',

)_BACKENDS = (

'django.contrib.auth.backends. ModelBa_HOST = ' localhost '_PORT = 1025_HOST_USER = ''_HOST_PASSWORD = ''_USE_TLS = False_FROM_EMAIL = 'info @google.ru '= {

'version': 1,

'disable_existing_loggers': False,

'filters': {

'require_debug_false': {

'()': 'django.utils.log. RequireDebugFalse'

}

},

'handlers': {

'mail_admins': {

'level': 'ERROR',

'filters': ['require_debug_false'],

'class': 'django.utils.log. AdminEmailHandler'

}

},

'loggers': {

'django.request': {

'handlers': ['mail_admins'],

'level': 'ERROR',

'propagate': True,

},

}

}_PROFILE_MODULE = 'profile. Profile'ckend', # this is default

'guardian.backends. ObjectPermissionBackend',

)_USER_ID = -1_URLCONF = 'diplom.urls'_TAGS = {.DEBUG: 'debug',.INFO: 'alert-info',.SUCCESS: 'alert-success',.WARNING: 'alert-warning',.ERROR: 'alert-error',

}_DIRS = (.path.join (PROJECT_ROOT, ' diplom /fixtures'),

)_APPLICATION = 'diplom.wsgi.application'_APPS = (

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

'django.contrib.messages',

'django.contrib.staticfiles',

'django.contrib.flatpages',

'django.contrib.redirects',

' filebrowser ',

'grappelli.dashboard',

' grappelli ',

'guardian',

'django.contrib.admin',

'django.contrib.admindocs',

'south',

'registration',

' diplom ',

'profile',

' blog ',

'messages',

)installed_apps.grappelli import *installed_apps.logs import *installed_apps.filebrowser import *_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'_FROM_EMAIL = 'info @google.ru '= {

'version': 1,

'disable_existing_loggers': False,

'filters': {

'require_debug_false': {

'()': 'django.utils.log. RequireDebugFalse'

}

},

'handlers': {

'mail_admins': {

'level': 'ERROR',

'filters': ['require_debug_false'],

'class': 'django.utils.log. AdminEmailHandler'

}

},

'loggers': {

'django.request': {

'handlers': ['mail_admins'],

'level': 'ERROR',

'propagate': True,

},

}

}_PROFILE_MODULE = 'profile. Profile'

Файл installed_apps/filebrowser.py (содержит все настройки для Filebrowser):

# -* - encoding: utf -8 -*- django.utils.translation import ugettext_lazy as __DIRECTORY = 'uploads/'_CONVERT_FILENAME = True_NORMALIZE_FILENAME = True_VERSIONS = {

'admin_thumbnail': {'verbose_name': _(' AdminThumbnail '), 'width': 60, 'height': 60, 'opts': 'crop'},

' thumbnail ': {'verbose_name': _(' Thumbnail (1 col)'), 'width': 60, 'height': 60, 'opts': 'crop'},

'news_logo': {'verbose_name': (u' Логотипновости '), 'width': 100, 'height': 75, 'opts': 'crop'},

'services_thumbnail': {'verbose_name': (u' Миниатюрыдляуслуг '), 'width': 120, 'height': 90, 'opts': 'crop'},

'our_face': {'verbose_name': (u' Фотографиинашихсотрудников '), 'width': 216, 'height': 278, 'opts': 'crop'},

'profile_photo': {'verbose_name': (u' Фотографияпользователя '), 'width': 205, 'height': 250, 'opts': 'crop'},

'admin_list_blog': {'verbose_name':u' Изображениедлясписокаблогов (655*215)', 'width': 655, 'height': 215, 'opts': 'crop'},

 

}_ADMIN_VERSIONS = [' thumbnail ', 'news_logo', 'services_thumbnail', 'our_face', 'profile_photo',

'admin_list_blog'] #'small', 'medium', 'big', 'large', _ADMIN_THUMBNAIL = 'admin_thumbnail'_MAX_UPLOAD_SIZE = 60485760

_IMAGE_MAXBLOCK = 1024*1024_EXTENSIONS = {

'Folder': [''],

'Image': ['. jpg ', '. jpeg ', '. gif ', '. png ', '. tif ', '. tiff '],

'Document': ['. pdf ', '.doc', '. rtf ', '. txt ', '. xls ', '. csv '],

'video': ['. mov ', '. wmv ', '. mpeg ', '. mpg ', '. avi ', '. rm '],

'audio': ['.mp3', '.mp4', '. wav ', '. aiff ', '. midi ', '.m4p']

}_SELECT_FORMATS = {

'file': ['Folder', 'Image', 'Document', 'video', 'audio'],

'image': ['Image'],

'document': ['Document'],

'media': ['video', 'audio'],

}

Файл diplom/urls.py (содержит все url настроек и сслыки на urls.py других приложений):

from django.conf.urls import patterns, include, urldjango.conf import settingsdjango.contrib import adminfilebrowser.sites import site.forms import RegistrationFormProfileprofile.views import ProfileSettingView, UploadViewregistrationos.autodiscover()= patterns ('',

(r'^accounts/', include ('registration.urls')),(r'^ grappelli /', include ('grappelli.urls')),

(r'^accounts/', include ('registration.urls')),

(r'^accounts/profile/$', 'profile.views.profile_return'),

(r'^accounts/edit/profile/$', ProfileSettingView.as_view()),(r'^ admin / filebrowser /', include (site.urls)),(r'^ admin /', include (admin.site.urls)),(r'^media/(? P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),(r'^ admin /doc/', include ('django.contrib.admindocs.urls')),

(r'^upload_file/$', UploadView.as_view()),(r'^profile/', include ('profile.urls')),(r'^message/', include ('messages.urls')),(r'^ blog /', include ('blog.urls')),

)

Приложение PROFILE:

Файл profile/urls.py (содержит все url-ы приложения profile):django.conf.urls import patterns, include, urlviews import ProfileView= patterns ('',(r'^$', ProfileView.as_view(), name= «profile»),(r'^friend/(? P <pk> \d+)/$', ProfileView.as_view(), name= «profile_friend»),(r'^friends/all/$', 'profile.views.search_person'),(r'^friends/add/(? P<id>[^/]+)/$', 'profile.views.add_person'),(r'^friends/ del /(? P<id>[^/]+)/$', 'profile.views.del_person'),(r'^friends/accept/(? P <objid> [^/]+)/$', 'profile.views.accept_friend'),(r'^friends/reject/(? P <objid> [^/]+)/$', 'profile.views.reject_friend'),

)

Файл profile/models.py (содержит модели Profile и FileProfile приложения profile):

# -* - coding: utf -8 -*- django.db import modelsdjango.contrib.auth.models import Userdiplom.settings import *filebrowser.fields import FileBrowseFielddjango.core.urlresolvers import reversedatetime

 

Profile (models. Model):= models. ForeignKey (User, related_name='profile', verbose_name=('User'), blank=True, null=True)= FileBrowseField (u «Иконка», max_length=200, directory='uploads/', format='image', null=True, blank=True)= models. TextField (u' Дополнительныесведения ', blank=True)= models. CharField (u' Логин ', max_length=150, blank=True, null=True)_name = models. CharField (u' Фамилия ', max_length=150, blank=True)_name = models. CharField (u' Имя ', max_length=150, blank=True)_name = models. CharField (u' Отчество ', max_length=150, blank=True)

= models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friends_targets')_requests = models. ManyToManyField («self», blank=True, null=True, symmetrical = False, related_name='friend_requests_targets')


icq = models. CharField (u'ICQ', max_length=150, blank=True)= models. CharField (u' Skype ', max_length=150, blank = True)= models. CharField (u' Телефон ', max_length=150, blank = True)= models. BooleanField (u' Являетсяучастникомсообщества ', blank=True, default=False)

__unicode__(self):u' % s'% (self.user)

get_absolute_url(self):reverse («profile», kwargs={})

get_files(self):FileProfile.objects.filter (user = self)

Meta:_name = u " Пользователь»_name_plural = u " Пользователи»

 

FileProfile (models. Model):= models. ForeignKey (Profile, related_name='profile', verbose_name=('User'), blank=True, null=True)= models. CharField (u «Заголовок», max_length=64, blank=True, null=True)= models. DateTimeField (verbose_name=u' Датазагрузкифайла ', blank=True, null=True, default = datetime.datetime.now)= FileBrowseField (u «Файл», directory='uploads/files/', max_length=100, format = 'document', null=True, blank=True)


def __unicode__(self):u' % s'% (self.user)Meta:_name = u " Файлпользователя»_name_plural = u " Файлыпользователей»

Файл profile/admins.py (содержит подключение и настройки модели Profile, FileProfile для административной части):django.contrib import adminmodels import Profile, FileProfileProfileContentAdmin (admin. TabularInline):= FileProfile= ('title', 'file',)= 1FileProfileAdmin (admin. ModelAdmin):_display = ('user', 'title', 'file', 'date')= ('user', 'date')_filter = ('user', 'date')ProfileAdmin (admin. ModelAdmin):_display = ('user', 'last_name', 'first_name', 'midlle_name', 'party')= ('user',)_filter = ('user',)= [ProfileContentAdmin].site.register (Profile, ProfileAdmin).site.register (FileProfile, FileProfileAdmin)

Файл profile/forms.py (содержит модельные формы ProfileForm, BlogForm, FileForm приложения profile):

# -* - encoding: utf -8 -*- django import formsmodels import Profile, FileProfileblog.models import BlogProfileForm (forms. ModelForm):Meta:= Profile= ('user', ' thumbnail ', 'login', 'friends', 'friend_requests', 'party')= forms. FileField (max_length=200, label= «Иконка», required=False)_password = forms. CharField (max_length=150, required=False, label=' Новыйпароль ')_password = forms. CharField (max_length=150, required=False, label=' Подтвердитьпароль ')

BlogForm (forms. ModelForm):Meta:= Blog= ('number', 'author', 'date_of_publication', 'image', 'tags')= forms. FileField (max_length=200, label= «Обложкановости», required=False)

FileForm (forms. ModelForm):Meta:= FileProfile= ('user', 'date', 'file')= forms. FileField (max_length=200, label= «Файл», required=False)

Файл profile/views.py (содержит View описывающие функционал главной страницы пользователя и страницы поиска других пользователей):

# -* - coding: utf -8 -*- django.views.generic import ListView, DetailView, TemplateView, Viewmodels import Profilemessages.models import Chat, Messagedjango.views.decorators.csrf import csrf_exemptdjango.shortcuts import render_to_responsedjango.contrib.auth.models import Userforms import ProfileForm, BlogForm, FileFormdjango.views.generic.edit import FormView, CreateView, UpdateViewdjango.template import RequestContextdjango import formsdjango.db.models import Qdjango.http import HttpResponse, HttpResponseRedirectdatetimedjango.shortcuts import render_to_response, redirectblog.models import Blog, Tagsdjango.core.urlresolvers import reversedjango.core.files.storage import default_storagedjango.core.files.base import ContentFilefilebrowser.base import FileObject

profile_return(request):render_to_response ('profile/return.html', {}, context_instance=RequestContext(request))

UploadView(View):post (self, request, *args, **kwargs):= FileForm (request.POST, request.FILES)form.is_valid:= form.save (commit=False)= default_storage.save ('uploads/files/file.pdf', ContentFile (self.request.FILES['doc'].read())).file = FileObject(path).user = Profile.objects.get (user = request.user).save()redirect (self.get_absolute_url())

get_absolute_url(self):reverse («profile», kwargs={})

ProfileView(CreateView):_name = «profile/profile.html»_class = BlogFormcreate_object_profile (self, pk):= User.objects.get (pk = pk)= Profile().user_id = vector.id.first_name = vector.first_name.last_name = vector.last_name.save()objectget_context_data (self, **kwargs):= super (ProfileView, self).get_context_data(**kwargs)(self.request.user.is_authenticated()) and (Profile.objects.get (pk=self.request.user.id).party==True) and (not ' pk ' in self.kwargs):_obj = self.request.userProfile.objects.filter (pk=person_obj.id).count()==0:.create_object_profile (person_obj.id)_pk = person_obj.idself.request.user.is_authenticated() and ' pk ' in self.kwargs and self.kwargs[' pk ']:_pk = self.kwargs[' pk ']Profile.objects.filter (pk=person_pk).count()==0:.create_object_profile (person_pk)_obj = User.objects.get (pk = person_pk):.template_name = «profile/error.html»['ErrorText'] = u " Вынеавторизированны»

context[' blog '] = Blog.objects.filter (author=person_obj.username).order_by ('-number',)['person'] = Profile.objects.get (pk = person_pk)['form_file'] = FileFormcontextform_valid (self, form):_obj_tags=[]_tags = self.request.POST['tag'].split (', ' or ', ')elem in all_tags:_num_tags = Tags.objects.all().order_by ('-number') [0]_tag = Tags (number = max_num_tags.number+1, name = elem)_tag.save()_obj_tags.append (obj_tag)= form.save (commit=False)= Blog.objects.filter (author=self.request.user.username).order_by ('-number')blogs.count() > 0:.number = blogs[0].number+1:.number = 1.author = self.request.user.username.date_of_publication = datetime.datetime.now()= default_storage.save ('uploads/mar.jpg', ContentFile (self.request.FILES[' thumbnail '].read()))_image = FileObject(path).version_generate ('admin_list_blog').image = obj_image.save()elem in arr_obj_tags:.tags.add(elem)redirect (self.get_absolute_url())get_absolute_url(self):reverse («profile», kwargs={})ProfileSettingView (TemplateView, View):_name = «user_profile/user_settings.html»_method_names = ['get', 'post']post (self, request, *args, **kwargs):= Profile.objects.get (user = request.user)= ProfileForm (request.POST, request.FILES, instance = object) # A form bound to the POST data form.is_valid():.save (commit = False)= default_storage.save ('uploads/mar.jpg', ContentFile (request.FILES['image'].read()))_image = FileObject(path).version_generate ('profile_photo').thumbnail = obj_image.save()

# Новыйпароль и Подверждениепароля _password = request.POST ['new_password']_password = request.POST ['confirm_password']

# Выбираемобьект User для изменеияпароля

index = User.objects.get (pk = request.user.id).set_password (new_password) new_password == «:

mes = ' Поле (новыйпароль) пусто:'

else:confirm_password == new_password:= ' Паролисовпадают!'.save():

mes = ' Паролинесовпадают!'

form.save()redirect (reverse(«profile», kwargs={}))get_context_data (self, **kwargs):= super (ProfileSettingView, self).get_context_data(**kwargs)self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= Profile.objects.get (user = self.request.user)['object'] = object_id = self.request.user['form'] = ProfileForm (instance = object)not Profile.objects.filter (pk = user_id.id):= Profile().pk = user_id.id.user = user_id.save()context:_name = «profile/error.html»['ErrorText'] = u " Вынеавторизированны»

return context

@csrf_exemptsearch_person(request):= Nonerequest.user.is_authenticated() and Profile.objects.get (pk=request.user.id).party==True:ContactForm (forms. Form):_name = forms. CharField (max_length=150, required=False)_name = forms. CharField (max_length=150, required=False)= forms. CharField (max_length=150, required=False)_name = forms. CharField (max_length=150, required=False)_user = request.user.get_profilerequest.method == 'POST':= ContactForm (request.POST)= []form.is_valid():_name = form.cleaned_data ['last_name']_name = form.cleaned_data ['first_name']_name = form.cleaned_data ['midlle_name']= form.cleaned_data['user']= {'last_name__icontains':last_name}.append (apply(Q, (), kargs)).append (Q(first_name__icontains = first_name)).append (Q(midlle_name__icontains = midlle_name)).append (Q(user__username__icontains = user))_result = Profile.objects.filter(*params)= {'form': form, 'search_result': search_result, 'User':current_user}:= ContactForm()= {'form':form, 'User':current_user}render_to_response ('friends/search_person.html', context, context_instance=RequestContext(request)):render_to_response («friends/error.html», {'ErrorText': u» Вынеавторизированны»})add_person (request, id):= Profile.objects.get (user = id)= Profile.objects.get (user = request.user.get_profile).friends.add(obj).friend_requests.add(user)HttpResponseRedirect ('/profile/friends/all/')del_person (request, id):= Profile.objects.get (user = id)= Profile.objects.get (user = request.user.get_profile).friends.remove(obj)HttpResponseRedirect ('/profile/friends/all/')accept_friend (request, objid):= Profile.objects.get (user= request.user.get_profile)_friend = Profile.objects.get (user = objid).friends.add (obj_friend).friend_requests.remove (obj_friend)HttpResponseRedirect ('/profile/friends/all/')reject_friend (request, objid):= Profile.objects.get (user = request.user.get_profile)_friend = Profile.objects.get (user = objid).friend_requests.remove (obj_friend)HttpResponseRedirect ('/profile/friends/all/')

@csrf_exemptmy_friends(request):= Nonerequest.user.is_authenticated() and Profile.objects.get (pk=request.user.id).party==True:= User.objects.all()request.method == 'POST':= {'friends': friends}render_to_response ('friends/choice_friend.html', context, context_instance=RequestContext(request)):

# еслинезалогинен

# хорошобысделатьизэтойпроверкидекоратор, чтобвсюдуеёнетоскатьзасобой

return render_to_response («friends/error.html», {'ErrorText': u» Вынеавторизированны»})

Приложение BLOG:

Файл urls.py для приложения blog:

from django.conf.urls import patterns, include, url.views import BlogList, ArticleMonthArchiveView, BlogDetail, FilterTagsView, BlogSearchView= patterns ('',(r'^list/$', BlogList.as_view(), name='blog_list'),(r'^(? P<year>\d{4})/(? P<month>\d+)/$',.as_view (month_format=' % m'),= «archive_month_numeric»),(r'^detail/(? P <pk> \d+)/$', BlogDetail.as_view(), name='blog_detail'),(r'^filter/tag/(? P <pk> \d+)/', FilterTagsView.as_view(), name='filter_tags'),(r'^search/$', BlogSearchView.as_view(), name='blog_search'),

)

Файл models.py для приложения blog:

# -* - coding: utf -8 -*- django.db import modelsdjango.contrib.auth.models import Userfilebrowser.fields import FileBrowseFieldmodel_utils.fields import SplitFieldmodel_utils.models import TimeStampedModeldatetimedjango.db.models import permalinkdjango.core.urlresolvers import reverse

Tags (models. Model):= models. IntegerField (u' Порядковыйномер ', blank=True, null=True)= models. CharField (u' Названиетега ', max_length=500)__unicode__(self):u' % s'% (self.name)Meta:_name = u " Тег»_name_plural = u " Теги»Blog (models. Model):= models. IntegerField (u «Порядкоыйномер», blank=True, null=True)= models. CharField (u «Заголовок», max_length=64, blank=True, null=True)= models. CharField (u «Автор», max_length=200, blank=True)= FileBrowseField (u «Фото», max_length=200, directory='images/ blog /', format='image', null=True, blank=True)_of_publication = models. DateTimeField (verbose_name=u' Датапубликацииновости ', blank=True, null=True, default = datetime.datetime.now)= SplitField (u' Текст ', blank=True)= models. ManyToManyField (Tags, verbose_name=u' Теги ', blank=True)__unicode__(self):u' % s'% (self.zagol,)Meta:_name = u " Блог»_name_plural = u " Блог»Comment (models. Model):=models. ForeignKey (Blog, verbose_name=u' Откакогоблога ', related_name='link_blog', blank=True, null=True)_name=models. CharField (u «Автор», max_length=120, blank=True)=models. TextField (u' Комментарий ', blank=True)_date=models. DateTimeField (u' Датапубликации ', default = datetime.datetime.now, blank=True)_comment=models. BooleanField (u' Допущенаадминистратором ', default=False, blank=True)__unicode__(self):self.author_namecount_comment(self):Comment.objects.filter (article=self.article).count()Meta:_name = u " Комментарий»_name_plural = u " Комментарии»=['pub_date',]

Файл admin.py для приложения blog:

# -* - encoding: utf -8 -*- django.contrib import admin.models import Blog, Comment, TagsBlogAdmin (admin. ModelAdmin):_display = ('number', ' zagol ',)_display_links = ('number', ' zagol ',)_filter = ()_fields = ()= ('number',)_hierarchy='date_of_publication'TagsAdmin (admin. ModelAdmin):_display = ('number', 'name',)_display_links = ('number', 'name',)_filter = ()_fields = ()= ('name',)

CommentAdmin (admin. ModelAdmin):_display=('pub_date', 'author_name',)_fields=('text',)_filter=('author_name',)_hierarchy='pub_date'

.site.register (Blog, BlogAdmin).site.register (Tags, TagsAdmin).site.register (Comment, CommentAdmin)

Файл forms.py для приложения blog:

# -* - coding: utf -8 -*- django import formsregistration.forms import RegistrationFormUniqueEmaildjango.core.mail import send_mail.models import Blog

RegistrationFormProfile(RegistrationFormUniqueEmail):= forms. CharField (label = ' Работа ')

BlogForm (forms. Form):= forms. CharField (max_length=150)= forms. EmailField()= forms. CharField (widget=forms. Textarea)send_email (self, subject, message, from_email, recipient_list=['viktori2000 @qip.ru '], fail_silently=False):send_mail (subject, message, from_email, recipient_list, fail_silently)

Файл views.py для приложения blog:

# -* - coding: utf -8 -*- django.views.generic import ListView, DetailView, TemplateView.models import Blog, Tags, Commentdjango.contrib.auth.models import Userdjango.views.generic.edit import FormView, CreateView, UpdateViewdjango.forms import ModelFormdjango import formsdjango.db.models import Qdjango.contrib.auth.models import Userdatetime.forms import BlogFormdjango.views.generic.edit import CreateViewdjango.views.generic.dates import MonthArchiveViewprofile.models import Profiledjango.shortcuts import redirectdjango.core.urlresolvers import reverseCreateNews(CreateView):= Blog= ['number', ' zagol ', 'author', 'image', 'date_of_publication', 'text', 'tags']get_context_data (self, **kwargs):self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= super (CreateNews, self).get_context_data(**kwargs)['object'] = Profile.objects.get (pk = self.request.user.id)context


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', 'month'):_obj.append(obj)['archives'] = date_obj['active_main_menu']='main_blog':.template_name = «profile/error.html»['ErrorText'] = u " Вынеавторизированны»

return context

FilterTagsView(DetailView):= Blog_name = «blog /blog_list.html»= Blog.objects.all()get_context_data (self, **kwargs):= super (FilterTagsView, 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', 'month'):_obj.append(obj)= super (FilterTagsView, self).get_object()[' blog '] = Blog.objects.filter (tags__pk = object.pk)['archives'] = date_obj['active_main_menu']='main_blog'context

BlogSearchView(ListView):_name = ' blog /blog_list.html'= Blogget_context_data (self, **kwargs):= super (BlogSearchView, 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', 'month'):_obj.append(obj)['archives'] = date_obj['active_main_menu']='main_blog'_word = self.request.GET ['search_box'].lower()= [].append (Blog.objects.filter (Q(zagol__icontains = search_word)))[' blog ']=Blog.objects.filter (Q(zagol__icontains = search_word)|Q (author__icontains = search_word)|Q (text__icontains = search_word))context

ArticleMonthArchiveView(MonthArchiveView):= Blog.objects.all()_field = «created»_object_list = True_future = Trueget_context_data (self, **kwargs):self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= super (ArticleMonthArchiveView, self).get_context_data(**kwargs)_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)['archives'] = date_obj['active_main_menu']='main_blog'context

BlogDetail(CreateView):_name = «blog /blog_detail.html»= Comment= ['article', 'author_name', 'pub_date', 'admin_comment']get_context_data (self, **kwargs):self.request.user.is_authenticated() and Profile.objects.get (pk=self.request.user.id).party==True:= super (BlogDetail, self).get_context_data(**kwargs)_obj = []obj in Blog.objects.dates ('created', 'month'):_obj.append(obj)[' blog '] = Blog.objects.get (pk = self.kwargs[' pk '])['archives'] = date_obj['active_main_menu'] = 'main_blog'['comments'] = Comment.objects.filter (article = context[' blog '], admin_comment=True)contextform_valid (self, form):= form.save (commit=False).article = Blog.objects.get (pk=self.kwargs[' pk ']).author_name = self.request.user.username.pub_date = datetime.datetime.now().save()redirect (self.get_absolute_url())get_absolute_url(self):reverse («blog_detail», kwargs={«pk»: self.kwargs[' pk ']})

Приложение MESSAGE:

Файл urls.py для приложения message:

from django.conf.urls import patterns, include, url= patterns ('',(r'^$', 'messages.views.all_message'),(r'^ sendmessage /(? P<id>[^/]+)/$', 'messages.views.send_message'),

)

Файл admin.py для приложения message:

from django.contrib import admin.models import Message, ChatMessageAdmin (admin. ModelAdmin):_display = ('recipient', 'sender', 'date', 'title')= ('recipient', 'sender')_filter = ('recipient', 'sender').site.register (Message, MessageAdmin)

ChatAdmin (admin. ModelAdmin):_display = ('person1', 'person2')= ('person1', 'person2')_filter = ('person1', 'person2').site.register (Chat, ChatAdmin)

Файл views.py для приложения message:

# -* - coding: utf -8 -*-. models import Message, Chatprofile.models import Profiledjango.views.decorators.csrf import csrf_exemptdjango.template import RequestContext # нужночтобыпередаватьреквест в контекст django.forms import ModelFormdjango.http import HttpResponse, HttpResponseRedirectdjango import formsdjango.db.models import Qdjango.shortcuts import render_to_response, redirectdjango.contrib.auth.models import Userdatetimetime

 

@csrf_exemptall_message(request):= Nonerequest.user.is_authenticated() and Profile.objects.get (pk=request.user.id).party==True:_am = User.objects.get (pk = request.user.id)= Q (person2 = i_am)= Q (person1 = i_am)_friend = Chat.objects.filter (temp4 | temp5)_am = User.objects.get (pk = request.user.id)= Message.objects.filter (recipient = i_am).filter (reader = False).count()= all_friend= {'all_friend':all_friend, 'messages': messages, 'image':image}render_to_response ('friends/all_message.html', context, context_instance=RequestContext(request)):render_to_response («friends/error.html», {'ErrorText': u» Вынеавторизированны»})

@csrf_exemptsend_message (request, id):MessageForm (forms. Form):= forms. CharField (max_length=350, required=False)= forms. CharField (max_length=350, required=False, widget=forms. Textarea)= User.objects.get (pk = id)_am = User.objects.get (pk = request.user.id)= Q (recipient = friend) & Q (sender = i_am)= Q (recipient = i_am) & Q (sender = friend)= temp1 | temp2= Q (person2 = i_am) & Q (person1 = friend)= Q (person1 = i_am) & Q (person2 = friend)len (Chat.objects.filter (temp4 | temp5)) == 0:= Chat().person1 = i_am.person2 = friend.save():request.method == 'POST':_message = Message.objects.filter(temp3).order_by('date')_obj = Chat.objects.get (temp4 | temp5)= MessageForm (request.POST)form.is_valid():= form.cleaned_data['title']= form.cleaned_data['message']_message = Message()_message.recipient = friend_message.sender = i_am_message.date = datetime.datetime.now()_message.title = title_message.message = message_message.reader = False_message.save()_obj.messages.add (send_message)_obj.save()redirect ('/message/ sendmessage /'+ str(id) + '/'):_message = Message.objects.filter(temp3).order_by('date') [0:1]= Q (person2 = i_am) & Q (person1 = friend)= Q (person1 = i_am) & Q (person2 = friend)_type = Chat.objects.filter (temp4 | temp5)= MessageForm()= Message.objects.filter(temp2)elem in send:not elem.reader:.reader=True.save()= {'form':form, 'friend': friend, 'all_message': all_message}render_to_response ('friends/send_message.html', context, context_instance=RequestContext(request))

 


Приложение В

 

ККМОО «Молодежная лига развития национальных культур Кубани»

, г. Краснодар, ул. Красноармейская 53.

ИНН: 2310023918

КПП: 231001001

Счет №407038108000000000019

Банк: АО «Юг-Инвест банк», г. Краснодар

БИК 040349966

Счет №: 30101810600000000966

Код по ОКОНХ 98400

Код по ОКПО 39744165

Приложение №1 к договору № ________ от «__» ______ 2012 г.

Техническое задание для создания программной и визуальной части сайта:

. Разработка дизайна для графической части сайта.

. Разработка логотипа в векторном формате.

. Создание программного обеспечения на языке программирования Python, в среде Django.

. Создание социального раздела для общения между участниками «Клубов интернациональной дружбы».

.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...