arrayField не обновляется?

#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. Я неправильно понял, что вы хотели сказать. Я думал, вы говорили, что я должен сохранить поле массива, только если оно ранее было пустым. Теперь я понял. Это была глупая ошибка, я даже не знаю, что было у меня на уме, лол. Большое спасибо 🙂