#python #django
#python #django
Вопрос:
Я пытаюсь проверить, был ли выполнен урок (проверяя, была ли страница посещена один раз в зарегистрированной учетной записи).
Я пытался проверить, была ли эта страница посещена. Если нет, то идентификатор должен быть добавлен в массив посещенных страниц.
Я проверяю все возможные ситуации (или, по крайней мере, ту, о которой я мог подумать), и когда мне нужно, я добавляю еще одну lection.id к массиву доступных уроков. После каждого ввода этого массива я видел, что идентификатор урока добавляется, но не в базу данных. (если я проверяю базу данных или меняю страницу, идентификатор урока исчезает)
views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from .models import Lectie
def lectii(req):
lectii = Lectie.objects.all().order_by("id")
if req.user.is_authenticated:
if req.user.profile.lectiiRezolvate == None:
lectiiRezolvate=[]
else:
lectiiRezolvate = req.user.profile.lectiiRezolvate
else:
lectiiRezolvate=[]
context = {
'lectii': lectii,
'lectiiRezolvate': lectiiRezolvate
}
print(lectiiRezolvate)
return render(req, '../templates/pagini/lectii-selector.html', context)
def lectie(req, lectie_id):
if req.user.is_authenticated:
if req.user.profile.lectiiRezolvate == None:
req.user.profile.lectiiRezolvate.append(lectie_id)
user.profile.save()
print(req.user.profile.lectiiRezolvate)
else:
if lectie_id in req.user.profile.lectiiRezolvate:
pass
else:
req.user.profile.lectiiRezolvate.append(lectie_id)
print(req.user.profile.lectiiRezolvate)
else:
pass
lectie2 = get_object_or_404(Lectie, pk=lectie_id)
lectiePDF = 'lectii/lectia-{}.pdf'.format(lectie2)
context = {
'lectiePDF': lectiePDF,
'lectie2': lectie2,
}
return render(req, '../templates/pagini/lectii.html', context)
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.lectii, name="lectii"),
path('<int:lectie_id>', views.lectie, name="lectie")
]
lectii-selector.html
{% extends 'base.html' %}
{% block content %}
</div>
<div id="middle-section" class="container-fluid container-fluid-margin">
{% for lectie in lectii %}
<div class="row content-block" style="padding-top: 2rem;">
<div class="col-md-12 text-card">
<div class="card card-custom">
{% if lectie.id in lectiiRezolvate %}
<div class="card-body">
<h5 class="card-title">Capitolul {{lectie.capitol}}<i class="fas fa-check"></i></h5>
<p class="card-text">{{lectie.cardText}}</p>
<a href="{% url 'lectie' lectie.id %}" class="btn btn-primary">Reia</a>
</div>
{% else %}
<div class="card-body">
<h5 class="card-title">Capitolul {{lectie.capitol}}</h5>
<p class="card-text">{{lectie.cardText}}</p>
<a href="{% url 'lectie' lectie.id %}" class="btn btn-primary">Începe</a>
</div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
models.py из учетных записей (я расширил пользовательскую модель по умолчанию)
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.postgres.fields import ArrayField
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
xp = models.IntegerField(default=0)
lectiiRezolvate = ArrayField(models.IntegerField(), null=True, blank=True)
exercitiiRezolvate = ArrayField(models.IntegerField(), null=True, blank=True)
exercitiiProvocari = ArrayField(models.IntegerField(), null=True, blank=True)
def __str__(self):
return self.user.username
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
Я чувствую, что я неправильно добавляю в БД, и я что-то упускаю. Я пытался решить эту проблему, читая документы django, но я не нашел ничего полезного.
Итак, я полагаю, что профиль не обновляется, и я делаю что-то не так. Как я могу заставить это работать?
Комментарии:
1. Вероятно, для этого вам следует использовать отдельные модели и внешние ключи вместо поля массива.
Ответ №1:
Профиль сохраняется только в том случае, если поле массива ранее было пустым; вы не сохраняете его после добавления нового идентификатора.
(Также обратите внимание, что вы можете избежать необходимости проверки отсутствия, если добавите a default=list
в определение поля.)
Комментарии:
1. Я действительно не понимаю. Допустим, у меня есть 5 уроков. Как я могу добавить идентификатор каждого из них в lectiiRezolvate (решаемые уроки), когда к каждому из них был получен доступ в первый раз?
2. Чего вы не получили? Ваш код в порядке, за исключением того, что вы не сохранили объект profile после добавления lectie_id .
3. Я неправильно понял, что вы хотели сказать. Я думал, вы говорили, что я должен сохранить поле массива, только если оно ранее было пустым. Теперь я понял. Это была глупая ошибка, я даже не знаю, что было у меня на уме, лол. Большое спасибо 🙂