Работа с пользователями
Добавим связь тем (topics) с создавшими их пользователями, чтобы разные темы принадлежали разным пользователям. Для этого нужно открыть файл models.py (папка приложения) и изменить содержимое файла на следующее (добавленные строки выделены жирным):
from django.db import models
from django.contrib.auth.models import User
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.PROTECT)
def __str__(self):
return self.text
class Entry(models.Model):
topic = models.ForeignKey(Topic, on_delete=models.PROTECT)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
return self.text[:50] + "..."
Теперь нужно снова запустить следующие команды:
python manage.py makemigrations logs
python manage.py migrate
После запуска первой команды python manage.py makemigrations logs в консоли нужно будет выбрать первый вариант ответа на вопрос о том, какими значениями заполнить поле пользователя в таблице модели Topic. После чего нужно будет ввести id пользователя из таблицы пользователей. Пользователь у нас всего один, с id = 1, поэтому и укажем в консоли 1.
После этого запустим
python manage.py migrate
Теперь на индексной странице мы сможем выводить только записи, принадлежащие данному авторизованному пользователю, но для того, чтобы этот функционал работал нужно еще отредактировать файл views.py (папка приложения). Попутно, с помощью аннотации @login_required закроем страницы сайта для неавторизованных пользователей.
Содержимое файла views.py теперь должно быть следующим (добавленные строки выделены жирным):
from django.shortcuts import render
from .models import Topic
from django.contrib.auth.decorators import login_required
from django.http import Http404
@login_required
def index(request):
topics = Topic.objects.filter(owner=request.user).order_by('-date_added')
context = {
'topics': topics,
}
return render(request,
'logs/index.html', context)
@login_required
def topic(request, topic_id):
topic = Topic.objects.get(id=topic_id)
if topic.owner != request.user:
raise Http404
entries = topic.entry_set.order_by('-date_added')
context = {
'topic': topic,
'entries': entries,
}
return render(request,
'logs/topic.html', context)
Здесь конструкция:
if topic.owner != request.user:
raise Http404
проверяет, если данный пользователь не является создателем данной темы (topic), то ему будет показана страница 404.
Запрет пользователям выбирать других пользователей при создании новых тем
На данный момент любой пользователь (owner) сможет в админке выбрать любого другого пользователя и создать от его имени новую тему (topic).
Это не хорошо, поэтому запретим всем пользователям в админке выбирать другого пользователя, при создании новой темы (topic). Для этого снова отредактируем файл admin.py. Теперь его содержимое должно быть следующим:
from django.contrib import admin
from .models import Topic, Entry
admin.site.register(Entry)
class TopicAdmin(admin.ModelAdmin):
readonly_fields=('owner', )
def save_model(self, request, obj, form, change):
obj.owner = request.user
obj.save()
admin.site.register(Topic, TopicAdmin)
Здесь строка readonly_fields=('owner', ) указывает, что поле owner не редактируемое.
И в методе save_model() мы сохраняем поле owner в модели со значением текущего авторизованного пользователя.
Теперь форма сохранения новой темы (topic) должна выглядеть следующим образом:
Как видим, поле Owner здесь уже не редактируемое.
P.S.: При создании нового пользователя через админку Django нужно поставить галочку в строчке Staff status, чтобы у него был доступ к админке.
И также, в разделе User permissions добавить права на возможность работы с темами (Topics) и вложенными записями (Entries).
![](/assets/img/posts/57_django_site_example/9.png)