Проверка / сохранение формы Django для шаблона с различным количеством и порядком текста, изображений и форм - PullRequest
0 голосов
/ 11 мая 2018

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

Я использую подход, аналогичный последним главам (10-12) книги Джанго на примере . Приложение из этих глав приближается к тому, чтобы привести пример моего случая с использованием приложения платформы электронного обучения, но они позволяют учителям создавать только контент, такой как текст и изображения, но не позволяют учителям создавать вопросы для учащихся. Вот общий подход, которому я следую.

Книга моделирует содержание для текста и изображений для данной страницы следующим образом:

class Content(models.Model):
    page = models.ForeignKey(Page, related_name='contents')
    content_type = models.ForeignKey(ContentType,
                                     limit_choices_to={'model__in':('text',
                                                                    'image')})
    object_id = models.PositiveIntegerField()
    item = GenericForeignKey('content_type', 'object_id')
    order = OrderField(blank=True, for_fields=['page'])

    class Meta:
        ordering = ['order']


class ItemBase(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
         abstract = True

    def render(self):
         return render_to_string('courses/content/{}.html'.format(
                   self._meta.model_name), {'item': self})


class Text(ItemBase):
    content = models.TextField()

class Image(ItemBase):
    file = models.FileField(upload_to='images')

Есть интерфейс для учителей, чтобы заполнить и заказать этот контент для страницы.

Содержимое отображается в шаблоне следующим образом:

<div class="page">
    {% for content in page.contents.all %}
        {% with item=content.item %}
            <h2>{{ item.title }}</h2>
            {{ item.render }}
        {% endwith %}
    {% endfor %}
</div>

И HTML, используемый в методе рендеринга для текстового содержимого, просто:

{{item.content|linebreaks|safe }}

Мне не сложно расширить это с помощью QuestionTypes, которые расширяют ItemBase (аналогично моделям Text и Image), а также создать модель StudentAnswer для хранения ответов в базе данных.

Я бы, вероятно, переопределил рендер ItemBase и поместил бы его в модель QuestionType, чтобы я мог передать форму модели StudentAnswer в контекст для html-файла QuestionType.

Тогда я мог бы просто получить представленный html, содержащий {{form}}, для простоты, и теперь у нас есть вопрос, который действует как любой другой элемент контента и может быть упорядочен со всеми остальными. Это предполагает, что HTML, содержащий контент, имеет тег формы, который охватывает все отображаемые элементы контента.

Моя проблема обрабатывает запрос POST в представлении. Я понятия не имею, как проверить и сохранить ответы из нескольких форм на любой отдельной странице, созданной таким образом. Примеры, которые я нахожу, предполагают постоянное количество форм, которые вы знаете по имени и разных типов.

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

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

...