Я пытаюсь создать приложение 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 в представлении. Я понятия не имею, как проверить и сохранить ответы из нескольких форм на любой отдельной странице, созданной таким образом. Примеры, которые я нахожу, предполагают постоянное количество форм, которые вы знаете по имени и разных типов.
Я также поэкспериментировал с идеей создания единой динамически генерируемой формы, но примеры, которые я видел для этого, предполагают, что вы будете циклически проходить по полям в шаблоне и отображать их по порядку, а не мое требование, чтобы Учитель определяет порядок, который может включать в себя текст или изображения промежуточных вопросов.
Есть ли способ создать то, что я ищу, или кто-то может указать мне правильное направление?