Материал: Разработка архитектуры веб-сервиса закрытой социальной сети с использованием фреймворка Django

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

Шаблон error.html для вывода ошибки если пользователь не зарегистрирован.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Ошибка</h2>

{{ErrorText|safe}}

</div>

{% endblock %}

Шаблон my_profile.html для вывода личной информации пользователя.

{% extends "main.html" %}

{% block main %}

<div>

<form enctype="multipart/form-data">

<table>

<tr>

<td>

{% if person. thumbnail == "" %}

<img src="/media/images/default. png"/>

{% else %}

<img id="img-{{ person. thumbnail }}" src="{{ MEDIA_URL }}{{ person. thumbnail }}"/>

{% endif %}

</td>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

</table>

<u><a>

</form>

</div>

{% endblock %}

Шаблон user_settings.html для вывода страницы настроек личной информации.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Профиль пользователя {{user. username}}</h2>

{% if form. thumbnail. value %}

<img id="img-{{ object. thumbnail }}" src="{{object. get_thumbnail }}"/>

{% else %}

<img src="/media/images/default. png"/>

{% endif %}

<form enctype="multipart/form-data" action="" method="post">

<p>{{form. thumbnail}}</p>

<h4>Дополнительные сведения</h4>

<p>{{form. requisites}}</p>

<h4>Контактные данные</h4>

<p>{{form. user. label}}{{form. user}}</p>

<p>{{form. first_name. label}}{{form. first_name}}</p>

<p>{{form. last_name. label}}{{form. last_name}}</p>

<p>{{form. midlle_name. label}}{{form. midlle_name}}</p>

<p>{{form. icq. label}}{{form. icq}}</p>

<p>{{form. skype. label}}{{form. skype}}</p>

<p>{{form. telephone. label}}{{form. telephone}}</p>

<p>{{form. new_password. label}}{{form. new_password}}</p>

<p>{{form. confirm_password. label}}{{form. confirm_password}}</p>

{{error}}

<input>

</form>

</div>

{% endblock %}

{% block right %}

{% endblock %}

Шаблонный тег для вывода количества новых сообщений.

# - * - coding: utf-8 - *-django. template import Librarydjango. db. models import QSA. user_profile. models import Messagedjango. contrib. auth. models import User= Library ()

@register. filtermessages_count (obj):_am = User. objects. get (pk = obj)= Message. objects. filter (recipient = i_am). filter (reader = False). count ()messages

Файл views. py обрабатывающий страницу ДРУЗЬЯ и СООБЩЕНИЯ.

# - * - coding: utf-8 - *-SA. user_profile. models import Profile, Message, Chatdjango. views. decorators. csrf import csrf_exemptdjango. template import RequestContext # нужно чтобы передавать реквест в контекст

from 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_exemptsearch_person (request):= Nonerequest. user. is_authenticated ():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}render_to_response ('friends/search_person.html', context, context_instance=RequestContext (request)):= 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 ('/friends/')

# Прохождение по ссылке "Удалить друга"del_person (request, id):= Profile. objects. get (user = id)= Profile. objects. get (user = request. user. get_profile). friends. remove (obj)HttpResponseRedirect ('/friends/')

#Прохождение по ссылке "Принять друга"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 ('/friends/')

# Прохождение по ссылке отклонить другаreject_friend (request, objid):= Profile. objects. get (user = request. user. get_profile)_friend = Profile. objects. get (user = objid). friend_requests. remove (obj_friend)HttpResponseRedirect ('/friends/')

# Вывод всех друзей

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

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

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("friends/error.html", {'ErrorText': u"Вы не авторизированны"})

# Вывод объектов моделей Chat и Message

@csrf_exemptall_message (request):= Nonerequest. user. is_authenticated ():_am = User. objects. get (pk = request. user. id)= Q (person2 = i_am)= Q (person1 = i_am)_friend = Chat. objects. filter (temp4 | temp5) #person1 = request. user. username or person2 = request. user. username)

i_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)

#Выбираем отправить личное сообщение, и определяем в бд, что я - покупатель, а тот кому пишу письмо - продавец

friend = 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)

#Выбрали - отправить личное сообщение, и определяем в бд, что я - person1 и покупатель, а тот кому пишу письмо - person2 и продавец

if 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

#for elem in send_message:

send_message. reader = False_message. save ()_obj. messages. add (send_message)_obj. save ()redirect ('/myfriends/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 ()

#Если чувак открыл весь чат, то это значит, что он все сообщения уже прочел

# Которые находятся в переписке => они все устанавливаются в false= 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))

Шаблон error.html для тех кто не зарегестрировался.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Ошибка</h2>

{{ErrorText|safe}}

</div>

{% endblock %}

Шаблон search_person.html для вывода поисковой формы и всех добавленных или тех кто хочет добавиться в друзья

{% extends "main.html" %}

{% block main %}

<div>

<h1>Поиск друзей</h1>

<form action="" method="post">

<p>

<p>

<p>

<p>

<input>

{% for obj in search_result %}

{% if User! = obj %}

<p>{{ obj. last_name }} {{obj. first_name}} {{obj. midlle_name}} {{ obj. user }}</p>

{% if obj in User. friends. all %}

<p>Уже ваш друг! </p>

{% else %}

<p><a>

{% endif %}

{% endif %}

{% endfor %}

{% if User. friends. all %}

<h2>Мои друзья: </h2>

{% for elem in User. friends. all %}

<p>{{ elem }}</p>

<p><a>

<p><a>

{% endfor %}

{% endif %}

{% if User. friend_requests. all %}

<h2>К вам хотят добавиться: </h2>

{% for obj in User. friend_requests. all %}

<p>{{ obj }}</p>

<p><a>

<p><a>

{% endfor %}

{% endif %}

</form>

</div>

{% endblock %}

Шаблон all_message.html для вывода всех сообщений

{% extends "main.html" %}

{% block main %}

<form action="" method="post">

<table>

<tr>

<td colspan="2">Сообщения</td>

</tr>

{% for elem in all_friend %}

<tr>

<td>

<a href="/myfriends/sendmessage/{% if request. user. id == elem. person1. id %}{{elem. person2. id}}{% else %}

{{elem. person1. id}}{% endif %}/">

{% if request. user. id == elem. person1. id %}

{% if elem. person2. thumbnail == "" %}

<img src="/media/images/default. png"/>

{% else %}

<img id="img-{{ elem. person2. get_min_thumbnail }}" src="{{ elem. person2. get_min_thumbnail }}"/>

{% endif %}

{% else %}

{% if elem. person1. thumbnail == "" %}

<img src="/media/images/default. png"/>

{% else %}

<img id="img-{{ elem. person1. get_min_thumbnail }}" src="{{ elem. person1. get_min_thumbnail }}"/>

{% endif %}

{%endif%}

{% if user. id == elem. person2. id %}

<p>{{ elem. person1 }}</p>

{% else %}

<p>{{ elem. person2 }}</p>

{% endif %}

<div>{{ elem. last_message. date }}</div>

</a>

</td>

<td>

<a href="/myfriends/sendmessage/{% if request. user. id == elem. person1. id %}{{elem. person2. id}}{% else %}

{{elem. person1. id}}{% endif %}/">

<p>{{ elem. last_message. message|truncatechars: 80 }}</p>

</a>

</td>

</tr>

{% endfor %}

</table>

</form>

{% endblock %}

Шаблон send_message.html, для вывода всего чата и формы для отправки нового сообщения.

{% extends "main.html" %}

{% block main %}

<div>

<form action="" method="post">

<table>

<tr>

<td>История сообщений</td>

</tr>

{% for elem in all_message %}

{% if elem. reader %}

<tr bgcolor="#F8F8FF">

{% else %}

<tr bgcolor="#B2DFEE">

{% endif %}

<td>

<div>{{ elem. date }}</div>

<b>

{{ elem. sender }}

<br />

{{ elem. title }}

</b>

<p>{{ elem. message }}</p>

</td>

</tr>

{% endfor %}

</table>

<p>Кому: {{ friend. username }}</p>

<p>Заголовок: </p>

<div>{{ form. title }}</div>

<p>Сообщение: </p>

<div>{{ form. message }}</div>

<input>

</form>

</div>

{% block right %}

{% endblock %}

{% endblock %}

Модель приложения НОВОСТИ models. py

# - * - coding: utf-8 - *-django. db import modelsdjango. contrib. auth. models import UserdatetimeComment (models. Model):= models. CharField (max_length=350,verbose_name=u'Имя отправителя комментария',blank=True)= models. EmailField (max_length=350,verbose_name=u'E-mail',blank=True)= models. URLField (max_length=350,verbose_name=u'Адрес сайта',blank=True, verify_exists=False)= models. TextField (verbose_name=u'Комментарий', blank=True)Rubrics (models. Model):= models. CharField (max_length=350,verbose_name=u'Заголовок рубрики',blank=True)= models. CharField (max_length=350, verbose_name=u'Перевод на английский')__unicode__ (self):self. titleBlog (models. Model):= models. CharField (max_length=350,verbose_name=u'Заголовок новости',blank=True)_before = models. TextField (verbose_name=u'Начало новости', blank=True)_after = models. TextField (verbose_name=u'Окончание новости', blank=True)= models. DateTimeField (verbose_name=u'Дата опубликования новости',blank=True, null=True, default = datetime. datetime. now)= models. ManyToManyField (Rubrics, verbose_name=u'Рубрики', related_name='rubric', blank=True, null=True)= models. ManyToManyField (Comment, verbose_name=u'Комментарии', related_name='comments', blank=True, null=True)__unicode__ (self):self. title

Файл views. py для отображения данных на странице НОВОСТИ

# - * - coding: utf-8 - *-SA. blog. models import Blog, Rubrics, Commentdjango. views. decorators. csrf import csrf_exemptdjango. shortcuts import render_to_response, redirectdjango. template import RequestContext # нужно чтобы передавать реквест в контекст

from django. forms import ModelFormdjango. http import HttpResponse, HttpResponseRedirectdjango import formsdjango. db. models import Qdjango. contrib. auth. models import Userdatetimetime

@csrf_exemptblog_views (request):

# выводим все новости= Nonerequest. user. is_authenticated ():= Blog. objects. all ()= Rubrics. objects. all ()_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)= {'news': news, 'rubric': rubric, 'date_obj': date_obj }render_to_response ("blog/blog.html", context, context_instance=RequestContext (request)):

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

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

@csrf_exemptnew_news (request):

# выводим все новости= Nonerequest. user. is_authenticated ():BlogForm (forms. Form):= forms. CharField (max_length=150, required=False)_before = forms. CharField (max_length=350, required=False, widget=forms. Textarea)_after = forms. CharField (max_length=350, required=False, widget=forms. Textarea)request. method == 'POST':= BlogForm (request. POST)form. is_valid ():= form. cleaned_data ['title']_before = form. cleaned_data ['text_before']_after = form. cleaned_data ['text_after']= Blog (). title = title. text_before = text_before. text_after = text_after. date = datetime. datetime. now ()

#for elem in send_message:

new. save ()redirect ('/blog/'):= BlogForm ()= {'form': form}render_to_response ('blog/new_news.html', context, context_instance=RequestContext (request)):

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

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

@csrf_exemptblog_sort (request, slug):= Blog. objects. filter (rubrics__slug=slug)= Rubrics. objects. all ()_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)= {'news': news, 'rubric': rubric, 'date_obj': date_obj}render_to_response ("blog/blog.html", context, context_instance=RequestContext (request))

@csrf_exemptblog_sort_date (request, year, month):= Blog. objects. filter (date__year=year). filter (date__month=month)= Rubrics. objects. all ()_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)= {'news': news, 'rubric': rubric, 'date_obj': date_obj}render_to_response ("blog/blog.html", context, context_instance=RequestContext (request))

@csrf_exemptblog_all_text (request, id):= Nonerequest. user. is_authenticated ():CommentForm (forms. Form):_user = forms. CharField (max_length=150, required=False, initial = request. user. username)= forms. EmailField (max_length=150, initial=request. user. email)= forms. URLField (max_length=150, required=False, verify_exists=False)= forms. CharField (max_length=350, required=False, widget=forms. Textarea)_obj = []obj in Blog. objects. dates ('date', 'month'):_obj. append (obj. date)request. method == 'POST':

# Выберем тот объект из модели Blog, которой хотим отправить комментарий_new = Blog. objects. get (id = id)= CommentForm (request. POST)form. is_valid ():_user = form. cleaned_data ['name_user']= form. cleaned_data ['mail']= form. cleaned_data ['site']= form. cleaned_data ['comment']_comment = Comment ()_comment. name = name_user_comment. mail = mail_comment. site = site_comment.comment = comment_comment. save ()

# Добавляем в новость которую мы сейчас просматриваем новый комментарий_new.comments. add (model_comment)_new. save ()redirect ('/blog/blog_all_text/'+ str (id) + '/'):= CommentForm ()= Blog. objects. get (id = id)= Rubrics. objects. all ()= {'form': form, 'news': news, 'rubric': rubric, 'date_obj': date_obj}render_to_response ("blog/blog_all_text.html", context, context_instance=RequestContext (request)):

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

# хорошо бы сделать из этой проверки декоратор, чтоб всюду её не тоскать за собойrender_to_response ("user_profile/error.html", {'ErrorText': u"Вы не авторизированны"})

Шаблон blog.html для главной страницы приложения НОВОСТИ

{% extends "main.html" %}

{% block main %}

<div>

<form action="" method="post">

Архивы:

{% for obj in date_obj %}

<p><a>

{% endfor %}

<p>_________________________________________________________</p>

<table width="100%" border="0" cellspacing="0" cellpadding="4">

{% for elem in news %}

<tr align="center" bgcolor="#B2DFEE"><p> {{ elem. title }} </p></tr>

<tr align="center">

<p> </p>

<p>{{ elem. text_before }}</p></tr>

<tr align="center">

<p><a>

</tr>

<tr align="center"><p> {{ elem. date}} </p></tr>

{% endfor %}

</table>

<a>

</form>

</div>

{% endblock %}

Шаблон blog_all_text.html для просмотра всего текста новости и возможности написания комментария.

{% extends "main.html" %}

{% block main %}

<div>

<form action="" method="post">

Архивы:

{% for obj in date_obj %}

<p><a>

{% endfor %}

<p>_________________________________________________________</p>

<table width="100%" border="0" cellspacing="0" cellpadding="4">

<tr align="center" bgcolor="#B2DFEE"><p> {{ news. title }} </p></tr>

<tr align="center">

<p> {{ news. text_before }} </p>

</tr>

<tr align="center">

<p> {{ news. text_after }} </p>

</tr>

<tr align="center"><p> {{ news. date }}</p></tr>

</table>

<table>

<tr>

<td colspan="2">Комментарии</td>

</tr>

{% for obj in news.comments. all %}

<tr>

<td align="center"> {{ obj. name }}</td>

<td> {{ obj.comment }}</td>

</tr>

{% endfor %}

</table>

<table>

<tr><td> Имя: {{ form. name_user }}</td></tr>

<tr><td> Комментарии: {{ form.comment }}</td></tr>

</table>

<input type="submit" value="Отправить">

</form>

</div>

{% endblock %}

Шаблон new_news.html для опубликования новой новости.

{% extends "main.html" %}

{% block main %}

<div>

<h2>Новая запись</h2>

<img src="/media/images/default. png"/>

<form action="" method="post">

<h4>Заголовок</h4>

<p>{{form. title. label}}{{form. title}}</p>

<h4>Первая часть новости</h4>

<p>{{form. text_before. label}}{{form. text_before}}</p>

<h4>Вторая часть новости</h4>

<p>{{form. text_after. label}}{{form. text_after}}</p>

</form>

</div>

{% endblock %}