Вложение рекурсивных отношений Django в шаблонном вопросе - PullRequest
0 голосов
/ 26 мая 2019

Прежде всего, я хочу поблагодарить вас всех здесь, в переполнении стека.Я исследовал и смог найти много ответов на мои вопросы о рекурсивных отношениях в Джанго;весь путь от создания модели, до представления, теперь шаблон.Я новичок в Python, следовательно, новичок в Django.Поэтому я благодарю вас за подробные примеры в ответ на вопросы, которые задавали другие.

tl; dr

Мне нужно было иметь вложенный (упорядоченный) список, который имеетсвязь внешнего ключа с другой моделью.Я попытался использовать рекурсивный внешний ключ для «себя» и не смог выполнить задачу с помощью своего исследования.Благодаря @somecallitblues (может кто-нибудь сказать мне, как отдать ему должное?) За указание на Django-mptt, я смог решить эту проблему.

(Я не знаю, можно ли или как пометить этот вопрос как ответивший и / или мне следует изменить заголовок, чтобы другие пользователи могли выполнять поиск, если у них возникла та же проблема.форматирование моего вопроса (вопросов) / или правильный способ задать вопрос. Любые указатели были бы полезны.)

Модели

    from mptt.models import TreeForeignKey, MPTTModel

    class Topic(models.Model):
        wherein = models.CharField()            
        partof = models.CharField()            
        title = models.CharField()            
        slug = models.SlugField()

    class TextNode(MPTTModel):
        topic = models.ForeignKey(Topic)
        parent = TreeForeignKey(
                "self",
                on_delete=models.CASCADE,
                related_name="children",
                related_query_name="child",
                null=True,
                blank=True,
            )    
        body = models.TextField()

Просмотр

    def topic_node_list(request, slug):
        topics = Topic.objects.filter(slug__exact=slug)
        textnodes = TextNode.objects.filter(topic__slug__exact=slug)

        return render(request, "node_test.html", {"topics": topics, "textnodes": textnodes})    

Шаблон

{% load mptt_tags %}

<ul>
    {% for topic in topics %}
        <h2>{{ topic.title }}</h2>
        <ul>
        {% recursetree textnodes %}
            <li>
              {{ node.body}}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>
            {% endif %}
            </li>
        {% endrecursetree %}
        </ul>
    {% endfor %}
</ul>

urls.py

urlpatterns = [
    path("nodes/<slug:slug>/", views.topic_node_list, name="nodes"),    
    path("", views.home, name="home"),
    path('admin/', admin.site.urls),
 ]

Все отлично работает!Так что еще раз спасибо @somecallitblues!

НО !Я хотел бы изменить на

на упорядоченный список, и в зависимости от уровня вложенности, изменить тип.Я хотел бы, чтобы первый упорядоченный список был 1, 2., 3, следующий должен быть a., B., C., Затем i., Ii.III.и т.д. Может ли это быть сделано через JavaScript или jQuery?Я даже не знаю, где искать или что искать в моей поисковой системе.

Я впервые делаю проект на Python.Я только начал учиться в декабре, и я был привязан к простому ведению блогов, и мне нужно было пройти испытание, и о, о, боже, я многому научился!Я выздоравливаю после серьезной болезни и уже почти десять лет бездействую, поэтому возвращение в сложное положение дел является сложной задачей.Python очень помог мне в восстановлении мышечной памяти.

end tl; dr

Я пытаюсь создать приложение "отчет" (из-за отсутствия лучшего термина),Он содержит оглавление, вводный, сколько угодно разделов, библиографию, сноски, указатель, глоссарий и т. Д. У меня также есть приложение для вопросов, которые можно задавать вместе со способностью отвечать на указанные вопросы, вот где яУ меня есть проблема и основание для моего вопроса.Мой код для моделей, представлений и шаблонов будет добавлен ниже.(если я смогу понять, как разместить код).

У меня есть модель субъекта и модель тела.Предметная модель - это тема вопроса.Модель тела - это место, где хранятся тексты вопросов.Каждый вопрос может иметь или не иметь подвопрос.Модель Body имеет внешний ключ к модели Subject.Модель Body имеет рекурсивный внешний ключ для «себя».Эти отношения работают нормально, хотя у меня есть вопрос «как мне это сделать», который я перечислю ниже.**

Для представления у меня есть общий ListView модели Subject и добавлен дополнительный контекст для модели Body.

Шаблон является основой моей проблемы.Я могу вложить упорядоченный список «предмета» и «тела» задаваемого вопроса.просто хорошо.Здесь я размещаю детей вопросов (или подвопросов).

Шаблон перечислит родительский вопрос в упорядоченном списке вместе с его детьми.Затем дети начинают перечислять как родительский вопрос, поэтому, по сути, они публикуются дважды.Один раз правильно как подвопрос, а затем неправильно как родительский вопрос (хотя я хотел бы знать, как перечислить подвопрос в качестве родителя для подвопроса (отношения внуков?).)

IЯ думал о том, чтобы создать собственный менеджер моделей или метод (ы) класса для сортировки родителей и детей, но как мне поступить?Как я уже сказал, я новичок в Python и Django, поэтому понятия не имею.

Я использую:Версия Django: 2.1.8 Django-pyodbc-azure 2.1 python 3.7.2

Вот мой код:

Модели

class Subject(models.Model):
    ...
        wherein = models.CharField(
                max_length=3,
                choices=WHERE,
                default=SECTION,
                help_text="Where in the report",
                )
        partof = models.CharField(
                max_length=5,
                choices=PART_OF,
                default=QUESTION,
                help_text="Is this a question or answer?")
        title = models.CharField(
                max_length=80,
                help_text="What is the subject of the question",
                )
        slug = models.SlugField(
                max_length=80,
                help_text="This is what the url will be"
                )
    class Body(models.Model):
        subject = models.ForeignKey(
                Subject,
                on_delete=models.CASCADE,
                verbose_name="subject of",
                help_text="What subject does this text relate to?"
                )
        parent = models.ForeignKey(
                "self",
                on_delete=models.CASCADE,
                verbose_name="subsection of",
                related_name="subsections",
                related_query_name="subsection",
                null=True,
                blank=True,
                )
        text = models.TextField(
                max_length=1500,
                help_text="Text of the paragraph",)

Вид

    class QuestionList(ListView):
        queryset = Subject.objects.filter(id=2)
        template_name = "questions/questions_list.html"
        context_object_name = "subjects"

        def get_context_data(self, *args, object_list=None, **kwargs):
            context = super(QuestionDetail, self).get_context_data(**kwargs)
            context["bodies"] = Body.objects.filter(subject__partof__exact="QUES")
            return context

Шаблон

    <ol type="1">
        {% for subject in subjects %}
                <li><b>{{ subject.title }}</b></li>
    <ol type="a">
        {% for body in bodies %} # I believe this is where I need to filter for just parents
            <li>{{ body.text }}</li>
            <ol type="i">
                {% for sub in body.subsections.all %}
                    <li>{{ sub.text }}</li>
                {% endfor %}
            </ol>
        {% endfor %}
    </ol>
    </ol>
    {% endfor %}

Я хотел бы иметь возможность для дальнейшего вложения (иметь детей от потомка родителя).

Должен ли я добавить дополнительный контекст для родителей: Body.objects.filter(parent_id__isnull=True)?если да, то как в шаблонах это будет работать с отношениями с детьми?(вложение списка).

** дополнительный вопрос: Как бы я сделал «ребенка» родителем для своего «ребенка»?и как они будут вложены в шаблон?

Надеюсь, я правильно изложил свою проблему, я постарался опубликовать столько, сколько мог, и надеюсь, что это простой способ решить.Если есть что-то, что я пропустил, пожалуйста, не стесняйтесь спрашивать!

Спасибо!

ОБНОВЛЕНИЕ : Вот то, что шаблон для отображения в виде HTML

# The first ol

    <li>1. This would be the topic a question</li>
           <li>a. This would be the parent question.</li>
                 <li>i. This would be the child of the parent question a.</li>
                 <li> ii. This would also be a child of the parent question a.</li>
           <li>b. This would be the second parent question</li>
           <li>c. This would be the third parent question</li>
                  <li>i. This would be the child of the parent question c.</li>
                  <li> ii. This would also be a child of the parent question c.</li>
           <li>d. … and so on</li>
    <li>2. This would be the next topic of a question</li>

ОБНОВЛЕНИЕ 2 : я понял, что не обновлял то, как все происходит сейчас.Вот оно:

    <li>1. This would be the topic a question</li>
           <li>a. This would be the parent question.</li>
                 <li>i. This would be the child of the parent question a.</li>
                 <li> ii. This would also be a child of the parent question a.</li>
           <li>b. This would be the second parent question</li>
           <li>c. This would be the third parent question</li>
                  <li>i. This would be the child of the parent question c.</li>
                  <li> ii. This would also be a child of the parent question c.</li>
           <li>d. … and so on</li>
           <li>e. This would be the child of the parent question a.</li>
           <li>f. This would also be a child of the parent question a.</li>           
           <li>g. This would be the child of the parent question c.</li>
           <li>h. This would also be a child of the parent question c.</li>
           <li>i. … and so on</li>
    <li>2. This would be the next topic of a question</li>

Сейчас я читаю Django docs о добавлении собственного менеджера моделей.Немного смущен, но я буду продолжать пробовать новые способы ведения дел.Как я уже сказал, в данный момент я немного растерян и могу действительно помочь.

ОБНОВЛЕНИЕ 3

Я воспользовался советом @somecallitblues и взялвремя, чтобы пройти и Django-treebead и Django-mptt.С Treebeard я не мог понять, как работать с шаблонами.С mppt я смог построить модели, но не смог соединить две модели вместе для отображения в шаблоне, и в представлении мне пришлось жестко кодировать topic_id.Я чувствую, что что-то упустил.Кто-нибудь может указать мне, где мои проблемы?Я читаю все документы, но не понимаю, где и как применять методы.Я очень новичок в веб-разработке, будучи новичком в Python.

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

Для моделей Subject остается тем же, за исключением того, что он называется Topic, поэтому я не буду сообщать, что:

обновленная модель тела:

class BodyNode(MPTTModel):
    topic = models.ForeignKey(
            Topic,
            on_delete=models.CASCADE,
            verbose_name="Of topic",
            help_text="What topic is being discussed?",
            )    
    text = models.TextField(
            max_length=750,
            help_text="Content of the paragraph",
            )
    parent = TreeForeignKey(
            "self",
            on_delete=models.CASCADE,
            related_name="children",
            blank=True,
            null=True,
            )

View:

def topic_list(request):
    bodynodes = BodyNode.objects.filter(topic_id=2)

    return render(request, "mpttapp/topic_list.html", {"bodynodes": bodynodes})

Шаблон:

 <ol class="root" type="a">
                    {% recursetree bodynodes %}
                        <li>
                            {{ node.text }}
                            {% if not node.is_leaf_node %}
                                    <ol type="i" class="children">
                                    {{ children }}
                                    </ol>
                            {% endif %}
                        </li>
                    {% endrecursetree %}
                </ol>

Прямо сейчас список отображается так, как должен, но только для topid_id = 2. Мне нужно, чтобы он был динамическим, наряду с возможностью добавленияполе slug для url, наряду с возможностью использовать поле заголовка из модели Topic, поэтому я на полпути туда.

Я хочу поблагодарить @somecallitblues за помощь, я чувствую, что используя mpttэто путь, так как я буду в состоянии сделать более глубокое вложение в случае необходимости.Я просто чувствую, что я немного над головой, но я действительно решил это понять.Мне просто нужно несколько указателей.

ОБНОВЛЕНИЕ 4

Я думаю, что я выяснил проблему отношений.Я собираюсь превратить модель темы в MPTTModel с TreeForeignKey из BodyNode.Я думаю, что отношение к модели «Тема» - это проблема с вложенностью, которая у меня возникла.Поскольку само приложение для начала является "своего рода" объектом дерева / каталога, это может быть причиной моей борьбы.Завтра я снова обновлюсь, если это сработает, я действительно хотел бы решить эту проблему, и эта тема будет полезна всем, кто сталкивается с такой же проблемой.

Я трачу МНОГО времени на чтениедокументация на сайте Django-проекта, но я все еще немного запутался в создании шаблонов / представлений.Если кто-то знает хороший учебный сайт или хорошую книгу, которая делает нечто большее, чем простой блог, я был бы благодарен за эту рекомендацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...