Manager - это интерфейс, через который для моделей Django предоставляются операции запросов к базе данных. По крайней мере, один Manager существует для каждой модели в приложении Django.
По умолчанию Django добавляет Manager с именем objects в каждый класс модели Django. Однако, если вы хотите использовать objects в качестве имени поля или если вы хотите использовать имя, отличное от objects для Manager, вы можете переименовать его для каждой модели.
Чтобы переименовать Manager для данного класса, определите атрибут класса типа models.Manager() для этой модели. Например:
from django.db import models
class Person(models.Model):
#...
people = models.Manager()
Вы можете использовать настраиваемый Manager в конкретной модели, расширив базовый класс Manager и создав экземпляр своего настраиваемого Manager в своей модели.
from django.db import models
class PublishedManager(models.Manager):
def get_all_names(self):
f = 0
for i in self.model.objects.all():
i.task = "dafault " + str(f)
i.save()
f += 1
Добавляем менеджер в модель
class Tasks(models.Model):
task = models.TextField(max_length=350)
date = models.DateField()
objects = PublishedManager()
Расширяем функционал компонента
from django_unicorn.components import UnicornView
from Pages.models import Tasks
class MainPageView(UnicornView):
tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
new_task = ''
new_date = ''
def save(self):
new_field = Tasks(task = self.new_task, date = self.new_date)
new_field.save()
self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
self.new_task = ''
self.new_date = ''
def delete(self, pk):
field = Tasks.objects.get(id = pk)
field.delete()
self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
def set_to_default(self):
Tasks.objects.get_all_names()
self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
Исправляем шаблон
{% load unicorn %}
<html>
<head>
{% unicorn_scripts %}
</head>
<body>
<div unicorn:view>
{% csrf_token %}
<input type="text" unicorn:model.lazy="new_task" placeholder="New task" id="new_task">
<input type="text" unicorn:model.lazy="new_date" placeholder="New date" id="new_date">
<button unicorn:click="save">Add</button>
{% if tasks %}
{% for elements in tasks %}
<p>
{% for element in elements %}
{% if forloop.counter == 3 %}
<button unicorn:click="delete({{element}})">Delete</button>
{% else %}
{{element}}
{% endif %}
{% endfor %}
</p>
{% endfor %}
<button unicorn:click="set_to_default">To default</button>
<button unicorn:click="set_to_random">To random</button>
{% endif %}
</div>
</body>
</html>
Так же можно писать функции, напрямую влияющие на запись базы данных
class Tasks(models.Model):
task = models.TextField(max_length=350)
date = models.DateField()
objects = PublishedManager()
def set_random_name_from_list(self):
self.task = random.choice(['Memes', 'Do it again', 'Something good', 'awful'])
self.save()
Чтобы вызвать эту функцию, нам нужно напрямую обращаться к элементу базы данных
from django_unicorn.components import UnicornView
from Pages.models import Tasks
class MainPageView(UnicornView):
tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
new_task = ''
new_date = ''
def save(self):
new_field = Tasks(task = self.new_task, date = self.new_date)
new_field.save()
self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
self.new_task = ''
self.new_date = ''
def delete(self, pk):
field = Tasks.objects.get(id = pk)
field.delete()
self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
def set_to_default(self):
Tasks.objects.get_all_names()
self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
def set_to_random(self):
for i in Tasks.objects.all():
i.set_random_name_from_list()
self.tasks = [[x.task, x.date, x.pk] for x in Tasks.objects.all()]
Правки в код шаблона предлагаю внести самостоятельно (буквально одна кнопка)