Я работаю над приложением Django, в котором участвуют разные люди, компании и продукты. Я хотел бы включить возможность авторизованных пользователей в «избранном» числе людей, компаний и продуктов. Я довольно новый Django разработчик, и мои знания по Javascript скудны, поэтому я изо всех сил пытаюсь применить существующие уроки по Django / Ajax к моей ситуации. Вот что у меня так далеко. Я собираюсь включить лишь немного о предпочтении человека, так как я предполагаю, что решение для предпочтения компаний и продуктов будет практически идентичным.
# models.py (relevant tables only)
class Person(models.Model):
first_name = models.CharField(max_length=50)
middle_name = models.CharField(max_length=50, blank=True)
# many other irrelevant fields omitted
class CustomUser(AbstractUser):
fav_people = models.ManyToManyField(Person,
through='FavoritePerson',
through_fields=('user', 'person'),
related_name='users',
)
fav_companies = models.ManyToManyField(Company,
through='FavoriteCompany',
through_fields=('user', 'company'),
related_name='users',
)
fav_products = models.ManyToManyField(Product,
through='FavoriteProduct',
through_fields=('user', 'product'),
related_name='users',
)
class Meta:
verbose_name_plural = 'Custom Users'
def __str__(self):
if self.first_name and self.last_name:
return f"{self.first_name} {self.last_name}"
else:
return f"{self.username}"
class FavoritePerson(models.Model):
user = models.ForeignKey(CustomUser,
on_delete=models.CASCADE,
related_name='favorite_people'
)
person = models.ForeignKey(Person,
on_delete=models.CASCADE,
null=True,
blank=True,
related_name='favorite_people', )
created = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'Favorited People'
def __str__(self):
return f"{self.user} - {self.person}"
Вот соответствующая часть моего шаблона, где он отображает контур звезды если человек не фаворит и заполненная звезда, если человек является фаворитом вошедшего в систему пользователя. Я использую пакет django -fontawesome-5 для значков.
<!-- person_detail.html -->
<section id="entity-details">
<div class="container">
<div id="entity-bio-col">
{% if person in user.fav_people.all %}
{% fa5_icon 'star' 'fas' color='white' size='fa-xs' title='One of your favorite pros' %}
{% else %}
{% fa5_icon 'star' 'far' color='white' size='fa-xs' title='Favorite this pro' %}
{% endif %}
</div>
</div>
</section>
Все, что мне нужно сделать, это вставить строку в таблицу FavoritePerson, когда я нажимаю пометить звездочкой и удалить эту строку в таблице, когда я нажму на заполненную звездочку. Я хотел бы, чтобы это работало без ссылки на страницу sh, следовательно, подход Ajax.
Будет ли кто-то готов предоставить решение? Я могу взять это и бежать оттуда.