remotes/origin/setup
Mukhtar 10 years ago
commit 007dfcd49f
  1. 19
      archilance/mixins.py
  2. 3
      archilance/settings/base.py
  3. 25
      projects/forms.py
  4. 4
      projects/templates/chattest.html
  5. 7
      projects/templates/contractor_project_detail.html
  6. 6
      projects/templates/projects/project_detail.html
  7. 15
      projects/urls.py
  8. 45
      projects/views.py
  9. 6
      templates/home.html
  10. 6
      templates/partials/base.html
  11. 23
      templates/partials/header.html
  12. 11
      templates/test.html
  13. 15
      users/templates/customer_profile_open_projects.html
  14. 4
      users/templates/customer_profile_trashed_projects.html
  15. 17
      users/templates/partials/customer_profile_info_block.html
  16. 22
      users/urls.py
  17. 56
      users/views.py

@ -0,0 +1,19 @@
from django.contrib.sites.models import Site
from django.views.generic.base import ContextMixin
class BaseMixin(ContextMixin):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
pk = self.kwargs.get('pk')
if pk:
context['pk'] = pk
context['domain'] = Site.objects.get_current().domain
return context
# import code; code.interact(local=dict(globals(), **locals()))

@ -26,6 +26,7 @@ DJANGO_APPS = [
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'django.contrib.humanize', 'django.contrib.humanize',
'django.contrib.sites',
] ]
THIRD_PARTY_APPS = [ THIRD_PARTY_APPS = [
@ -169,3 +170,5 @@ REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework_filters.backends.DjangoFilterBackend',), # djangorestframework-filters 'DEFAULT_FILTER_BACKENDS': ('rest_framework_filters.backends.DjangoFilterBackend',), # djangorestframework-filters
} }
SITE_ID = 1

@ -2,7 +2,10 @@ from django import forms
from django.forms import ModelForm, HiddenInput, Form, Select from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory from django.forms.models import inlineformset_factory
from mptt.forms import TreeNodeChoiceField from mptt.forms import TreeNodeChoiceField
from .models import Project, Portfolio, Answer, Realty, PortfolioPhoto, Stage, Specialization from .models import Project, Portfolio, Answer, Realty, PortfolioPhoto, Stage, Specialization
from users.models import User
# RealtyFormSet = inlineformset_factory(Project, Realty) # RealtyFormSet = inlineformset_factory(Project, Realty)
@ -89,6 +92,7 @@ class AnswerForm(ModelForm):
'term_type': Select(attrs={'class':'selectpicker'}), 'term_type': Select(attrs={'class':'selectpicker'}),
} }
class StageForm(ModelForm): class StageForm(ModelForm):
class Meta: class Meta:
model = Stage model = Stage
@ -102,5 +106,24 @@ class StageForm(ModelForm):
# 'term_type', # 'term_type',
) )
from django.forms.models import inlineformset_factory
PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',)) PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',))
class ProjectTrashForm(Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req')
super().__init__(*args, **kwargs)
if self.req.user.is_authenticated():
self.fields['pk'].queryset = self.req.user.projects
def clean(self):
cleaned_data = super().clean()
if not self.req.user.is_authenticated():
raise forms.ValidationError('Пользователь не залогинен')
return cleaned_data

@ -1,9 +1,9 @@
{{ user }} {{ request.user }}
<h2>Мои проекты</h2> <h2>Мои проекты</h2>
{% for proj in user.projects.all %} {% for proj in request.user.projects.all %}
<h3>{{ proj }}</h3> <h3>{{ proj }}</h3>
<h5>{{ proj.order }}</h5> <h5>{{ proj.order }}</h5>
{% endfor %} {% endfor %}

@ -1,9 +1,12 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% load humanize %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
{% load staticfiles %}
{% load humanize %}
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">

@ -12,7 +12,7 @@
</div> </div>
<div class="doneBlock new-done disTab"> <div class="doneBlock new-done disTab">
<div class="triangle1"></div> <div class="triangle1"></div>
{% if user.is_contractor %} {% if request.user.is_contractor %}
<div class="col-lg-12 new-p"> <div class="col-lg-12 new-p">
<p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p> <p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p>
</div> </div>
@ -167,7 +167,7 @@
</div> </div>
{% if user.is_customer %} {% if request.user.is_customer %}
<div class="exBigBlock disTab"> <div class="exBigBlock disTab">
<div class="col-lg-12"> <div class="col-lg-12">
<p class="titleEx">Исполнители</p> <p class="titleEx">Исполнители</p>
@ -236,7 +236,7 @@
<p>Опубликован: {{ answer.created }}</p> <p>Опубликован: {{ answer.created }}</p>
</div> </div>
<div class="col-lg-3 retts"> <div class="col-lg-3 retts">
{% if user.is_customer %} {% if request.user.is_customer %}
<a class="candLink candLink1" href="{% url 'projects:add-candidate' answer_id=answer.id project_id=object.id %}">Кандидат</a> <a class="candLink candLink1" href="{% url 'projects:add-candidate' answer_id=answer.id project_id=object.id %}">Кандидат</a>
<a class="candLink candLink2" href="javascript:void(0)"> предложить проект </a> <a class="candLink candLink2" href="javascript:void(0)"> предложить проект </a>
{% endif %} {% endif %}

@ -2,19 +2,28 @@ from django.conf import urls
from django.views.generic import TemplateView from django.views.generic import TemplateView
from .views import ( from .views import (
ProjectsView, ProjectView, ProjectCreateView, add_candidate,
ProjectComparisonView, add_candidate, ChatView, OfferOrderView, ChatView,
OfferOrderView,
ProjectComparisonView,
ProjectCreateView,
ProjectsView,
ProjectTrashView,
ProjectView,
ProjectTestView,
) )
app_name = 'projects' app_name = 'projects'
urlpatterns = [ urlpatterns = [
urls.url(r'^$', ProjectsView.as_view(), name='list'), urls.url(r'^$', ProjectsView.as_view(), name='list'),
urls.url(r'^(?P<pk>\d+)/$', ProjectView.as_view(), name='detail'),
# urls.url(r'^(?P<pk>\d+)/$', ProjectTestView.as_view(), name='detail'),
urls.url(r'^(?P<pk>\d+)/trash/$', ProjectTrashView.as_view(), name='trash'),
urls.url(r'^candidate/add/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', add_candidate, name='add-candidate'), urls.url(r'^candidate/add/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', add_candidate, name='add-candidate'),
urls.url(r'^candidate/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'), urls.url(r'^candidate/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'),
urls.url(r'^create/$', ProjectCreateView.as_view(), name='project-create'), urls.url(r'^create/$', ProjectCreateView.as_view(), name='project-create'),
# urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'), # urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'),
urls.url(r'(?P<pk>\d+)$', ProjectView.as_view(), name='detail'),
urls.url(r'chat/$', ChatView.as_view(), name='chat'), urls.url(r'chat/$', ChatView.as_view(), name='chat'),
urls.url(r'offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'), urls.url(r'offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'),
] ]

@ -1,26 +1,23 @@
from django.shortcuts import render, get_object_or_404 from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.mixins import PermissionRequiredMixin from django.views.generic import ListView, DetailView, CreateView, View, TemplateView, FormView
from django.views.generic import ListView, DetailView, CreateView, View, TemplateView from pprint import pprint, pformat
from django.views.generic.edit import FormMixin import pydash as _
from users.models import User from users.models import User
from .models import Project, Portfolio, Candidate, Answer, Realty, Order from .models import Project, Portfolio, Candidate, Answer, Realty, Order
from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm, ProjectTrashForm
from .mixins import LastAccessMixin from .mixins import LastAccessMixin
class ProjectsView(ListView): class ProjectsView(ListView):
model = Project model = Project
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
return context
class ProjectView(LastAccessMixin, FormMixin, View): class ProjectView(LastAccessMixin, View):
model = Project model = Project
form_class = AnswerForm form_class = AnswerForm
template_name = 'contractor_project_detail.html' template_name = 'contractor_project_detail.html'
@ -50,7 +47,12 @@ class ProjectView(LastAccessMixin, FormMixin, View):
answer.save() answer.save()
order = Order.objects.create(project=project) order = Order.objects.create(project=project)
return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.id})) return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk}))
class ProjectTestView(DetailView):
model = Project
template_name = 'test.html'
class ProjectCreateView(PermissionRequiredMixin, View): class ProjectCreateView(PermissionRequiredMixin, View):
@ -92,6 +94,23 @@ class ProjectCreateView(PermissionRequiredMixin, View):
pass pass
class ProjectTrashView(View):
def post(self, req, *args, **kwargs):
form = ProjectTrashForm(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid():
project = form.cleaned_data.get('pk')
project.state = 'trashed'
project.save()
messages.info(req, 'Form valid')
else:
messages.info(req, 'Form invalid: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
redirect_to = req.POST.get('next')
return redirect(redirect_to)
class TestView(View): class TestView(View):
template_name = 'test_form.html' template_name = 'test_form.html'
form_class = RealtyForm form_class = RealtyForm

@ -9,9 +9,9 @@
<p class="welcomeMain">Основная задача сайта</p> <p class="welcomeMain">Основная задача сайта</p>
<p> <p>
Authed? {{ user.is_authenticated }}c Authed? {{ request.user.is_authenticated }}c
{{ user }}<br> {{ request.user }}<br>
{{ user.groups.all }} {{ request.user.groups.all }}
</p> </p>
</div> </div>
</div> </div>

@ -22,6 +22,12 @@
</head> </head>
<body> <body>
{% if messages %}
{% for message in messages %}
<div class="c" style='padding: 10px; margin-bottom: 6px'>{{ message | safe }}</div>
{% endfor %}
{% endif %}
{% block content %}{% endblock %} {% block content %}{% endblock %}
<script src='{% static "js/jquery-2.2.3.min.js" %}'></script> <script src='{% static "js/jquery-2.2.3.min.js" %}'></script>

@ -13,31 +13,32 @@
<a href="{% url 'projects:list' %}">Биржа проектов</a> <a href="{% url 'projects:list' %}">Биржа проектов</a>
<span></span> <span></span>
</li> </li>
<li class="icon_tm2"> <li class="icon_tm2">
<a href="{% url 'users:contractor-list' %}">Поиск исполнителей</a> <a href="{% url 'users:contractor-list' %}">Поиск исполнителей</a>
<span></span> <span></span>
</li> </li>
<li> <li>
{% if user.is_contractor %} {% if request.user.is_contractor %}
<a href="{% url 'users:contractor-office' user.id %}">Мой офис</a> <a href="{% url 'users:contractor-office' pk=request.user.pk %}">Мой офис</a>
{% endif %} {% endif %}
</li> </li>
{# <li class="icon_tm3">#} {# <li class="icon_tm3">#}
{# <a href="javascript:void(0)">Работы на продажу</a>#} {# <a href="#">Работы на продажу</a>#}
{# <span></span>#} {# <span></span>#}
{# </li> #} {# </li>#}
</ul> </ul>
</div> </div>
<div class="col-lg-2"> <div class="col-lg-2">
<div class="imgProfile"> <div class="imgProfile">
{% if user.is_contractor %} {% if request.user.is_contractor %}
<a href="{% url 'users:contractor-profile' user.id %}"> <a href="{% url 'users:contractor-profile' pk=request.user.pk %}">
<img src="img/profile.jpg" alt="profile-image"> <img src="img/profile.jpg" alt="profile-image">
</a> </a>
{% elif user.is_customer %} {% elif request.user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' user.id %}"> <a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}">
<img src="img/profile.jpg" alt="profile-image"> <img src="img/profile.jpg" alt="profile-image">
</a> </a>
{% endif %} {% endif %}
@ -48,7 +49,7 @@
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span> <span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
</button> </button>
<ul class="dropdown-menu menu-drop-new"> <ul class="dropdown-menu menu-drop-new">
{% if not user.is_authenticated %} {% if not request.user.is_authenticated %}
<li class="icon_mm1"> <li class="icon_mm1">
<a href="{% url 'auth_login' %}"> <a href="{% url 'auth_login' %}">
Войти заказчиком Войти заказчиком
@ -86,7 +87,7 @@
<span></span> <span></span>
</a> </a>
</li> </li>
{% if user.is_authenticated %} {% if request.user.is_authenticated %}
<li> <li>
<a href="{% url 'auth_logout' %}"> <a href="{% url 'auth_logout' %}">
Выйти Выйти

@ -1,11 +1,6 @@
{% extends '_layout.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% block content %} {% block content %}
<div ng-controller='TestCtrl as test'> <h1>project: {{ project }}</h1>
<ul ng-repeat='user in test.users'> <h1>object: {{ object }}</h1>
<li>{( user.first_name )}</li>
</ul>
</div>
{% endblock %} {% endblock %}

@ -9,12 +9,12 @@
<div class="buttonGP disTab"> <div class="buttonGP disTab">
<div class="btn-group valProject2"> <div class="btn-group valProject2">
<a href="{% url 'users:customer-profile-open-projects' pk=user.pk %}" class="btn btn-default" disabled> <a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default" disabled>
Открытые проекты Открытые проекты
<span><mark>2</mark> / <span>35</span></span> <span><mark>2</mark> / <span>35</span></span>
</a> </a>
<a href="{% url 'users:customer-profile-trashed-projects' pk=user.pk %}" class="btn btn-default"> <a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default">
Корзина Корзина
<span><mark></mark><span>7</span></span> <span><mark></mark><span>7</span></span>
</a> </a>
@ -67,12 +67,19 @@
<div class="col-lg-3 rightPro right-pro-red"> <div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro"> <p class="cenaPro">
{{ proj.price }} <i class="fa fa-rub"></i> {{ proj.budget }} <i class="fa fa-rub"></i>
</p> </p>
<ul> <ul>
<li>Редактировать</li> <li>Редактировать</li>
<li>Переместить в корзину</li>
<li>
<form action="{% url 'projects:trash' pk=proj.pk %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit">Переместить в корзину</button>
</form>
</li>
</ul> </ul>
</div> </div>
</div> </div>

@ -9,12 +9,12 @@
<div class="buttonGP disTab"> <div class="buttonGP disTab">
<div class="btn-group valProject2"> <div class="btn-group valProject2">
<a href="{% url 'users:customer-profile-open-projects' pk=user.pk %}" class="btn btn-default"> <a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default">
Открытые проекты Открытые проекты
<span><mark>2</mark> / <span>35</span></span> <span><mark>2</mark> / <span>35</span></span>
</a> </a>
<a href="{% url 'users:customer-profile-trashed-projects' pk=user.pk %}" class="btn btn-default" disabled> <a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default" disabled>
Корзина Корзина
<span><mark></mark><span>7</span></span> <span><mark></mark><span>7</span></span>
</a> </a>

@ -43,12 +43,17 @@
<div class="col-lg-9 divCol9 new-mar2"> <div class="col-lg-9 divCol9 new-mar2">
<div class="profileTabs2 tabs-new"> <div class="profileTabs2 tabs-new">
<ul class="nav nav-tabs nav-justified"> <ul class="nav nav-tabs nav-justified">
<li role="presentation" class="active"> {% url 'users:customer-profile-open-projects' pk=pk as a %}
<a href="{% url 'users:customer-profile-open-projects' pk=user.pk %}">Открытые проекты</a> {% url 'users:customer-profile-trashed-projects' pk=pk as a2 %}
{% url 'users:customer-profile-current-projects' pk=pk as b %}
{% url 'users:customer-profile-reviews' pk=pk as c %}
<li role="presentation" {% if request.path == a or request.path == a2 %}class="active"{% endif %}>
<a href="{{ a }}">Открытые проекты</a>
</li> </li>
<li role="presentation"> <li role="presentation" {% if request.path == b %}class="active"{% endif %}>
<a href="{% url 'users:customer-profile-current-projects' pk=user.pk %}">Текущие проекты</a> <a href="{{ b }}">Текущие проекты</a>
<div class="roundsCount"> <div class="roundsCount">
<div class="countR">0</div> <div class="countR">0</div>
@ -56,8 +61,8 @@
</div> </div>
</li> </li>
<li role="presentation"> <li role="presentation" {% if request.path == c %}class="active"{% endif %}>
<a href="{% url 'users:customer-profile-reviews' pk=user.pk %}">Отзывы</a> <a href="{{ c }}">Отзывы</a>
<div class="roundsCount"> <div class="roundsCount">
<div class="countG">0</div> <div class="countG">0</div>

@ -2,9 +2,17 @@ from django.conf import urls
from django.contrib.auth.views import login, logout from django.contrib.auth.views import login, logout
from .views import ( from .views import (
ContractorListView, ContractorOfficeDetailView, ContractorProfileDetailView, ContractorListView,
CustomerProfileCurrentProjectsView, CustomerProfileTrashedProjectsView, CustomerProfileOpenProjectsView, ContractorOfficeDetailView,
CustomerProfileReviewsView, UserDetailView, UserInfoListView, UserListView, UserView, ContractorProfileDetailView,
CustomerProfileCurrentProjectsView,
CustomerProfileOpenProjectsView,
CustomerProfileReviewsView,
CustomerProfileTrashedProjectsView,
# UserDetailView,
# UserInfoListView,
# UserListView,
# UserView,
) )
@ -18,9 +26,9 @@ urlpatterns = [
urls.url(r'^contractors/(?P<pk>\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'), urls.url(r'^contractors/(?P<pk>\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'),
urls.url(r'^contractor-office/(?P<pk>\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'), urls.url(r'^contractor-office/(?P<pk>\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'),
urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'), # urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'),
urls.url(r'^$', UserListView.as_view(), name='users_list'), # urls.url(r'^$', UserListView.as_view(), name='users_list'),
urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'), # urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'),
urls.url(r'contractors/$', ContractorListView.as_view(), name='contractor-list' ), urls.url(r'contractors/$', ContractorListView.as_view(), name='contractor-list' ),
urls.url(r'^(?P<pk>\d+)/$', UserView.as_view(), name='user_view'), # urls.url(r'^(?P<pk>\d+)/$', UserView.as_view(), name='user_view'),
] ]

@ -3,6 +3,7 @@ from django.contrib.auth.models import Group
from django.views.generic import ListView, DetailView, View, UpdateView from django.views.generic import ListView, DetailView, View, UpdateView
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from archilance.mixins import BaseMixin
from .models import User from .models import User
@ -12,79 +13,36 @@ class UserListView(ListView):
context_object_name = 'users' context_object_name = 'users'
class UserInfoListView(ListView):
model = User
template_name = 'users_info_list.html'
def get_context_data(self, **kwargs):
context = super(UserInfoListView, self).get_context_data(**kwargs)
context['groups'] = Group.objects.all()
context['performers'] = User.perform_objects.all()
context['customers'] = User.customers_objects.all()
return context
class UserDetailView(DetailView):
model = User
class UserView(View):
pass
# template_name = 'contractor.html'
#
# def get(self, request, pk):
# user = User.objects.get(pk=pk)
# user_group = user.groups.all().first()
# if 'Заказчики' in user_group.name:
# self.template_name = 'users/customer.html'
#
# return render(request, self.template_name, {'user': user})
# # import code; code.interact(local=dict(globals(), **locals()))
class UserUpdateView(UpdateView):
model = User
from django.http import Http404
from django.shortcuts import redirect
class ContractorListView(ListView): class ContractorListView(ListView):
model = User model = User
template_name = 'contractor_list.html' template_name = 'contractor_list.html'
class ContractorProfileDetailView(DetailView): class ContractorProfileDetailView(DetailView):
model = User model = User
template_name = 'contractor_profile.html' template_name = 'contractor_profile.html'
# def get_object(self, queryset=None):
# object = super().get_object()
# user_group = object.groups.all().first()
# if 'Исполнители' not in user_group.name:
# return redirect('/projects/')
# return object
class ContractorOfficeDetailView(DetailView): class ContractorOfficeDetailView(DetailView):
model = User model = User
template_name = 'contractor_office.html' template_name = 'contractor_office.html'
class CustomerProfileOpenProjectsView(BaseMixin, DetailView):
class CustomerProfileOpenProjectsView(TemplateView):
model = User model = User
template_name = 'customer_profile_open_projects.html' template_name = 'customer_profile_open_projects.html'
class CustomerProfileTrashedProjectsView(TemplateView): class CustomerProfileTrashedProjectsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_trashed_projects.html' template_name = 'customer_profile_trashed_projects.html'
class CustomerProfileCurrentProjectsView(TemplateView): class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_current_projects.html' template_name = 'customer_profile_current_projects.html'
class CustomerProfileReviewsView(TemplateView): class CustomerProfileReviewsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_reviews.html' template_name = 'customer_profile_reviews.html'

Loading…
Cancel
Save