1 Востаннє редагувалося ping (26.11.2016 09:33:01)

Тема: Django - є питання

не можу запровадити зміни в аплікації:
поміняв модель, витер стару базу, витер migrations/,  почитстив кеші

запускаю python manage.py makemigrations <app_name>

а воно створює 0001_initial.py на основі старої моделі

звідки django бере цю стару модель? де воно її зберігає і чому не бере  <app_name>/models.py  ?
p.s.
залишив ПОРОЖНІЙ файл <app_name>/models.py - все одно створює модель на основі старих даних.
ЗВІДКИ вони беруться?

2

Re: Django - є питання

ну оскільки база була повністю видалена - значить десь у вас в коді ще є посилання на стару модель (я так думаю). Ще раз перегляньте модель.

3

Re: Django - є питання

Q-bart написав:

ну оскільки база була повністю видалена - значить десь у вас в коді ще є посилання на стару модель (я так думаю). Ще раз перегляньте модель.

так, ви праві,  порився і знайшов старий код.

але сьогодні питнання цікавіше:
Django Template
кусок коду з app.html:

<hr>
<p>{{current_question.dict_answers}}</p>
<p>{{current_question.answers_order}}</p>
{% for k in current_question.answers_order %}
<h4>{{k}}=>{{current_question.dict_answers.k}}<== не працює</h4>
{%endfor%}
<hr>
<h4>=>{{current_question.dict_answers.2}}<==  але так, працює</h4>

а ось таки результат:

{1: '0 1 2 0', 2: '0 1 2', 3: 'error', 4: 'none of the mentioned'}

[4, 2, 3, 1]

4=><== не працює

2=><== не працює

3=><== не працює

1=><== не працює

=>0 1 2<== але так, працює

ЧОМУ ?????

4

Re: Django - є питання

https://docs.djangoproject.com/en/dev/r … ltins/#for

Коротше кажучи, так зробили і все.

5

Re: Django - є питання

Master_Sergius написав:

https://docs.djangoproject.com/en/dev/r … ltins/#for

Коротше кажучи, так зробили і все.

перебираючи через dict.items дані будуть виводиться в невідомому порядку, оскільки словник не індексується.
для виведення їх в потрібному мені порядку я якраз задавав список current_question.answers_order - сортуючи ключі
але так виходить, що доведетьсь перетворювати словник в список,  сортувати  і подавати в темплейт список значень і синхронізований список ключів

цікаво чи jinja2 теж має такі обмеження?

6

Re: Django - є питання

Хочете складну логіку - робіть її у вьюшках. Не дарма ж оце розділяють паттерном MVC моделі, вьюшки і контроллери (у джанго - темплейти). А в тому ж (загаданому на цьому ж форумі феніксі) пішли ще далі - моделі, вьюшки, контроллери і темплейти. Намагайтеся темплейти робити максимально простими і з мінімумом домішок коду.

7

Re: Django - є питання

Master_Sergius написав:

Хочете складну логіку - робіть її у вьюшках. Не дарма ж оце розділяють паттерном MVC моделі, вьюшки і контроллери (у джанго - темплейти). А в тому ж (загаданому на цьому ж форумі феніксі) пішли ще далі - моделі, вьюшки, контроллери і темплейти. Намагайтеся темплейти робити максимально простими і з мінімумом домішок коду.

ну, доступ до елемента словника по ключу - це аж ніяк не логіка :)

якщо можна ще питання - як в django правильноо обмежити час перегляду сторінки що викликається через view ?
скажімо, якщо сторінку дивляться більше 10 хв - закрити її і перейти на стартову.

8

Re: Django - є питання

Таке можна зробити засобами JS (JQuery), адже тригернути відображення нової сторінки можна лише зі сторони клієнта.

Подякували: ping, A.N.Onim2

9 Востаннє редагувалося ping (07.12.2016 08:35:01)

Re: Django - є питання

питання:
в view.py сформував вибірку об’єктів, які буду почергово виводити в template
але,після повернення з  template, вибірка чомусь губиться , збиваються дані .
де зберігати дані між викликами template?
request.sesssion - не хочеться ганяти масив інформації туди, де його ніхто не потребує.
писати в файл і зчитувати? впаде швидкодія.
в Flask є глобальні об’єкти ( g ),  але в django їх не бачу

p.s.
коли тестую через runserver - все працює чудово.
пролеми зі збоями при роботі  через uwsgi

10 Востаннє редагувалося Master_Sergius (07.12.2016 12:04:01)

Re: Django - є питання

ping написав:

питання:
в view.py сформував вибірку об’єктів, які буду почергово виводити в template
але,після повернення з  template, вибірка чомусь губиться , збиваються дані .
де зберігати дані між викликами template?
request.sesssion - не хочеться ганяти масив інформації туди, де його ніхто не потребує.
писати в файл і зчитувати? впаде швидкодія.
в Flask є глобальні об’єкти ( g ),  але в django їх не бачу

p.s.
коли тестую через runserver - все працює чудово.
пролеми зі збоями при роботі  через uwsgi

Покажіть код. А також поясніть що Ви хочете зробити і навіщо. Хоча схоже, що Вам потрібно кешувати результат вибірки, ось https://docs.djangoproject.com/en/1.10/topics/cache/

11 Востаннє редагувалося ping (07.12.2016 19:03:14)

Re: Django - є питання

Master_Sergius написав:
ping написав:

питання:
в view.py сформував вибірку об’єктів, які буду почергово виводити в template
але,після повернення з  template, вибірка чомусь губиться , збиваються дані .
де зберігати дані між викликами template?
request.sesssion - не хочеться ганяти масив інформації туди, де його ніхто не потребує.
писати в файл і зчитувати? впаде швидкодія.
в Flask є глобальні об’єкти ( g ),  але в django їх не бачу

p.s.
коли тестую через runserver - все працює чудово.
пролеми зі збоями при роботі  через uwsgi

Покажіть код. А також поясніть що Ви хочете зробити і навіщо. Хоча схоже, що Вам потрібно кешувати результат вибірки, ось https://docs.djangoproject.com/en/1.10/topics/cache/


from django.shortcuts import render, redirect
from django.core.mail import EmailMessage
from datetime import datetime, timedelta

from .models import Quiz, S, CategoryQuestion, UsefulLinks, Question

s = S()  # my session


def index(request):
    categories = CategoryQuestion.objects.all()
    categories.length = len(categories)
    for k, v in enumerate(categories):
        categories[k].number_questions = len(Question.objects.all().filter(enabled=True).filter(category=v.id))
    context = {'categories': categories, }
    return render(request, 'quiz/index.html', context)


def quiz(request, *args):
    status = args[0]
    print('\n     status:', status)
    if status == 'start':
        s.quiz = Quiz()
        print('\n             s.quiz created. length:', s.quiz.questions.__len__(), '   dict:', s.__dict__.keys(), '\n')
        context = {'number_questions': len(s.quiz.questions)}
        return render(request, 'quiz/quiz_start.html', context)
    elif status == 'next':
        print('s.quiz.current_number_question: ', s.quiz.current_number_question, s.__dict__.keys())
        if 'quiz' not in s.__dict__.keys():
            return redirect('quiz', 'start')
        if s.quiz.current_number_question >= 0:
            s.quiz.questions[s.quiz.current_number_question].user_answer = set(
                int(i) for i in dict(request._get_post()).get('user_answer', [0, ]))

        s.quiz.current_number_question += 1
        if s.quiz.current_number_question > len(s.quiz.questions) - 1:
            return redirect('quiz', 'finish')
        else:
            current_question = s.quiz.questions[s.quiz.current_number_question]
            current_question.list_answers = current_question.get_answers()
            current_question.input_type = current_question.get_input_type()
            context = {'current_question': current_question,
                       'current_question_number_in_quiz': s.quiz.current_number_question + 1,
                       'number_questions': len(s.quiz.questions),
                       }
            return render(request, 'quiz/quiz.html', context)
    elif status == 'finish':
        if 'quiz' not in s.__dict__.keys():
            return redirect('quiz', 'start')
        s.quiz.stop_time = datetime.now()
        s.quiz.time_delta = s.quiz.stop_time - s.quiz.start_time - timedelta(
            seconds=2)  # correction for time delay  with js-contdown in template
        result = s.quiz.result()
        result[0] = result[0][:s.quiz.current_number_question]
        context = {'result': result,
                   'questions_answers': [
                       [r,
                        a.name,
                        a.code,
                        [dict(a.list_answers)[i] for i in a.get_correct_answer()],
                        a.user_answer,
                        a.explanation]
                       for r, a in zip(result[0], s.quiz.questions[:s.quiz.current_number_question])],
                   'quiz_time': s.quiz.time_delta.__str__().split('.')[0],
                   }
        s.quiz.current_number_question = 0
        del s.quiz
        return render(request, 'quiz/quiz_finish.html', context)
    else:
        context = {'info': 'ERROR', }
        return render(request, 'quiz/quiz.html', context)

при роботі через uwsgi "гублиться "  s.quiz
причому губиться якось непрогнозовано - то відразу, то дозволить полистати пару сторінок

12

Re: Django - є питання

Боляче для очей читати отой метод quiz. Мені здається, потрібно вибрати інший підхід до тестування, так би мовити, трішки переробити архітектуру застосунку (приложения). І на методи варто розбити цей quiz. Глобальні змінні - то кака. Щось поширювати серед різних вьюшок/темплейтів можна за допомогою context_processors. Збереження якогось стану, передачу додаткових параметрів можна реалізувати за допомогою ajax/jquery.
Поки більше нічим не допоможу, бо мені важко читати оте :)

13

Re: Django - є питання

Master_Sergius написав:

Боляче для очей читати отой метод quiz. Мені здається, потрібно вибрати інший підхід до тестування, так би мовити, трішки переробити архітектуру застосунку (приложения). І на методи варто розбити цей quiz. Глобальні змінні - то кака. Щось поширювати серед різних вьюшок/темплейтів можна за допомогою context_processors. Збереження якогось стану, передачу додаткових параметрів можна реалізувати за допомогою ajax/jquery.
Поки більше нічим не допоможу, бо мені важко читати оте :)

jquery тут до чого? я навпаки - не хочу передавати в браузер те, що його не стосується.

щодо розбити на методи - погоджуюся, воно просто якось непомітно розрослося да нечитабельного розміру.

але чому дані, які записані в session дозволяють собі зникати і мінятися?

перероблю quiz - відпишу.

14

Re: Django - є питання

ping написав:

але чому дані, які записані в session дозволяють собі зникати і мінятися?

Тут під session мається на увазі оте S? Бо тоді все логічно - при кожному новому запиті, джанго по-новому викликає відповідні методи. Це не є той модуль, який один раз запустився і запускає все решту, а відтак його глобальні змінні лишаються на місці. А ось якщо використовувати django.session - то тут зовсім інше діло.

15

Re: Django - є питання

Master_Sergius написав:
ping написав:

але чому дані, які записані в session дозволяють собі зникати і мінятися?

Тут під session мається на увазі оте S? Бо тоді все логічно - при кожному новому запиті, джанго по-новому викликає відповідні методи. Це не є той модуль, який один раз запустився і запускає все решту, а відтак його глобальні змінні лишаються на місці. А ось якщо використовувати django.session - то тут зовсім інше діло.

саме воно - оте S.

так, я вроді зрозумів, чому проблема виникає.
але як тут правильно застосувати django.session ?

п.с.
розбив quiz на 3 окремі методи

from django.shortcuts import render, redirect
from django.core.mail import EmailMessage
from datetime import datetime, timedelta

from .models import Quiz, S, CategoryQuestion, UsefulLinks, Question

s = S()  # my session

# skipped some code....

def quiz_start(request):
    s.quiz = Quiz()
    context = {'number_questions': len(s.quiz.questions)}
    return render(request, 'quiz/quiz_start.html', context)


def quiz_process(request):
    if 'quiz' not in s.__dict__.keys():
        return redirect('quiz_start')
    if s.quiz.current_number_question >= 0:  # write user answer for previous  question
        s.quiz.questions[s.quiz.current_number_question].user_answer = set(
            int(i) for i in dict(request._get_post()).get('user_answer', [0, ]))

    s.quiz.current_number_question += 1
    if s.quiz.current_number_question > len(s.quiz.questions) - 1:
        return redirect('quiz_finish')
    else:
        current_question = s.quiz.questions[s.quiz.current_number_question]
        current_question.list_answers = current_question.get_answers()
        current_question.input_type = current_question.get_input_type()
        context = {'current_question': current_question,
                   'current_question_number_in_quiz': s.quiz.current_number_question + 1,
                   'number_questions': len(s.quiz.questions),
                   }
        return render(request, 'quiz/quiz_process.html', context)

16 Востаннє редагувалося Master_Sergius (07.12.2016 15:01:58)

Re: Django - є питання

Що таке django.sessions і з чим його їдять варто почитати на офф сайті. Зараз Я приблизно розумію, що Ви хочете зробити - щоб зберігалися відповіді користувача, номер питання, можливо, набрані бали і т.п. На стороні клієнта зберігати не можна, адже можна підробити результати таким чином. Отже, усі вже дані відповіді повинні зберігатися на стороні сервера (до речі, django.sessions фактично дані зберігає у таблиці на сервері, а у клієнта лише id до цієї сесії). Або можна самому зробити додаткову таблицю в бд, де власноруч зберігати відповіді так як заманеться і робити будь-які вибірки.
Основний принцип http - stateless.

17

Re: Django - є питання

питання вирішив за допомогою request.session
але змінив спосіб серіалізації з JSON (по замовчуванню)
на SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
це дозволило зберігати класи(включно з методами) впродовж сесії

18

Re: Django - є питання

питання таке появилося:
є модель базова

class message(models.Model):
    subject = models.CharField(max_length=100)
    body = models.TextField()
    
    class Meta:
         abstract = True

    def some_method():
          return

від неї треба успадкувати дві моделі Letter i Sms
нічого додавати не потрібно, нових полів не появляється, методів теж нових нема

то так і писати:

class Letter(Message):
    pass

???????

19

Re: Django - є питання

up , бо дуже треба відповідь.

20 Востаннє редагувалося Master_Sergius (22.02.2017 10:17:17)

Re: Django - є питання

ping написав:

питання таке появилося:
є модель базова

class message(models.Model):
    subject = models.CharField(max_length=100)
    body = models.TextField()
    
    class Meta:
         abstract = True

    def some_method():
          return

від неї треба успадкувати дві моделі Letter i Sms
нічого додавати не потрібно, нових полів не появляється, методів теж нових нема

то так і писати:

class Letter(Message):
    pass

???????


Невже так важко зайти на офіційну документацію?
https://docs.djangoproject.com/en/1.10/ … nheritance