Python 3.x Django表单-如何将表单(CreateView)组合到ListView类中

Python 3.x Django表单-如何将表单(CreateView)组合到ListView类中,python-3.x,django,forms,listview,create-view,Python 3.x,Django,Forms,Listview,Create View,我的应用程序有一个用户模型,我为其分配了不同的程序。每个程序包含不同的练习,对于每个练习,用户需要根据自己的练习填写结果 因此,基本上,我的练习HTML页面需要包含另一个表单,该表单提供用户输入区域 我的代码包含:用户模型、程序模型、练习模型、数据模型 程序模型: class Program(models.Model): patient = models.ForeignKey(User, on_delete=models.CASCADE, default=0) program_n

我的应用程序有一个用户模型,我为其分配了不同的程序。每个程序包含不同的练习,对于每个练习,用户需要根据自己的练习填写结果

因此,基本上,我的练习HTML页面需要包含另一个表单,该表单提供用户输入区域

我的代码包含:用户模型、程序模型、练习模型、数据模型

程序模型:

class Program(models.Model):
    patient = models.ForeignKey(User, on_delete=models.CASCADE, default=0)
    program_name = models.CharField(max_length=1000, default="")
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return str(self.id) + " - " + self.patient.username + " - " + self.program_name + " - " + str(self.date_posted)

    def get_absolute_url(self):
        return reverse('program-detail', kwargs={'pk': self.pk})
练习模式:

class Exercise(models.Model):
    program = models.ForeignKey(Program, on_delete=models.CASCADE, default=0)
    date_posted = models.DateTimeField(default=timezone.now)
    name = models.CharField(max_length=1000, default="")
    description = models.TextField(default="")
    load_share = models.TextField(default="")
    breath_method = models.TextField(default="")
    recovery_method = models.TextField(default="")
    measure_method = models.TextField(default="")
    notes = models.TextField(default="")
    extra_info = models.TextField(default="")
    reps = models.PositiveSmallIntegerField(default=0)
    sets = models.PositiveSmallIntegerField(default=0)

    def __str__(self):
        return str(self.program_id) + " - " + str(self.pk) + " - " + " - " + self.name + " - " + str(self.date_posted)
数据模型:

class Data(models.Model):
    exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, default="0")
    set_number = models.PositiveSmallIntegerField(default=0)
    spo2 = models.PositiveSmallIntegerField(default=0)
    hr = models.PositiveSmallIntegerField(default=0)
    physical_level = models.PositiveSmallIntegerField(default=0)
    breath_level = models.PositiveSmallIntegerField(default=0)
    sys = models.PositiveSmallIntegerField(default=0)
    dia = models.PositiveSmallIntegerField(default=0)
    misc_input = models.PositiveSmallIntegerField(default=0)

    def __str__(self):
        return self.exercise.name
程序视图(列表、创建、更新、删除):

数据视图:

(我的第一步是为这个模型创建一个CreateView,然后找出如何在练习ListView模板中实现它,但我不确定这是正确的方法)。 另一个问题-需要从用户当前正在进行的练习中自动填充“练习”输入

class DataCreateView(LoginRequiredMixin, CreateView):
    model = Data
    fields = ['set_number', 'spo2', 'hr', 'physical_level', 'breath_level', 'sys', 'dia', 'misc_input']
练习模板:

{% extends "program/base.html" %}
{% block content %}
    <h3> Program Exercises List </h3>
    {% for exercise in exercises %}
        <article class="media content-section">
            <div class="media-body">
                <div class="article-metadata">
                    {% if user.is_superuser %}
                        <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'exercise-update' exercise.id %}">Update</a>
                        <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'exercise-delete' exercise.id %}">Delete</a>
                        <p class="article-content">{{ exercise.name }}</p>
                    {% else %}
                        <p class="article-content">{{ exercise.name }}</p>
                    {% endif %}
                </div>
                <div class="article-metadata">
                    <p class="article-content">Exercise Description - {{ exercise.description }}</p>
                    <p class="article-content">Breathing Method - {{ exercise.breath_method}}</p>
                    <p class="article-content">Recovery Method - {{ exercise.recovery_method }}</p>
                    <p class="article-content">Measuring Method - {{ exercise.measure_method }}</p>
                    <p class="article-content">Exercise Load - {{ exercise.load_share }}</p>
                    <p class="article-content">Notes - {{ exercise.notes }}</p>
                    <p class="article-content">Extra Information - {{ exercise.extra_info }}</p>
                    <p class="article-content">Number of Repetiton - {{ exercise.reps }}</p>
                    <p class="article-content">Number of Sets - {{ exercise.sets }}</p>
                </div>
            </div>
        </article>
    {% endfor %}
    {% if is_paginated %}

        {% if page_obj.has_previous %}
            <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous Exercise</a>
        {% endif %}

        {% if page_obj.has_next %}
            <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next Exercise</a>
        {% else %}
            <a class="btn btn-outline-info mb-4" href="{% url 'web-home' %}">Exit</a>
        {% endif %}

    {% endif %}
{% endblock content %}
我添加了一个连接到数据模型的FormView,然后使用
get\u context\u Data
将其添加到我的ListView模板中。 有一个问题我仍然无法解决,那就是如何在我的数据模型中分配
exercise
属性,我目前正在做的exercise。 我有一个想法,它将是完美的

谢谢

class DataCreateView(LoginRequiredMixin, CreateView):
    model = Data
    fields = ['set_number', 'spo2', 'hr', 'physical_level', 'breath_level', 'sys', 'dia', 'misc_input']
{% extends "program/base.html" %}
{% block content %}
    <h3> Program Exercises List </h3>
    {% for exercise in exercises %}
        <article class="media content-section">
            <div class="media-body">
                <div class="article-metadata">
                    {% if user.is_superuser %}
                        <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'exercise-update' exercise.id %}">Update</a>
                        <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'exercise-delete' exercise.id %}">Delete</a>
                        <p class="article-content">{{ exercise.name }}</p>
                    {% else %}
                        <p class="article-content">{{ exercise.name }}</p>
                    {% endif %}
                </div>
                <div class="article-metadata">
                    <p class="article-content">Exercise Description - {{ exercise.description }}</p>
                    <p class="article-content">Breathing Method - {{ exercise.breath_method}}</p>
                    <p class="article-content">Recovery Method - {{ exercise.recovery_method }}</p>
                    <p class="article-content">Measuring Method - {{ exercise.measure_method }}</p>
                    <p class="article-content">Exercise Load - {{ exercise.load_share }}</p>
                    <p class="article-content">Notes - {{ exercise.notes }}</p>
                    <p class="article-content">Extra Information - {{ exercise.extra_info }}</p>
                    <p class="article-content">Number of Repetiton - {{ exercise.reps }}</p>
                    <p class="article-content">Number of Sets - {{ exercise.sets }}</p>
                </div>
            </div>
        </article>
    {% endfor %}
    {% if is_paginated %}

        {% if page_obj.has_previous %}
            <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous Exercise</a>
        {% endif %}

        {% if page_obj.has_next %}
            <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next Exercise</a>
        {% else %}
            <a class="btn btn-outline-info mb-4" href="{% url 'web-home' %}">Exit</a>
        {% endif %}

    {% endif %}
{% endblock content %}
class ExerciseListView(LoginRequiredMixin, ListView):
    model = Exercise
    context_object_name = 'exercises'
    paginate_by = 1

    def get_queryset(self):
        program_num = get_object_or_404(Program, pk=self.kwargs.get('pk'))
        return Exercise.objects.filter(program=program_num)

    def get_context_data(self, **kwargs):
        context = super(ExerciseListView, self).get_context_data(**kwargs)
        context['form'] = DataPatient()
        return context