Django表单-如何将表单CreateView组合到ListView类中

问题描述

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

因此,基本上,本练习的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,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,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

程序视图(列表,创建,更新,删除):

class ProgramListView(LoginrequiredMixin,ListView):
    model = Program
    template_name = 'program/prog.html'  # <app>/<model>_<viewtype>.html
    context_object_name = 'programs'

    def get_queryset(self):
        return Program.objects.filter(patient=self.request.user)


class ProgramCreateView(LoginrequiredMixin,UserPassesTestMixin,CreateView):
    model = Program
    fields = ['patient','program_name']

    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff


class ProgramUpdateView(LoginrequiredMixin,UpdateView):
    model = Program
    fields = ['patient','program_name']

    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff


class ProgramDeleteView(LoginrequiredMixin,DeleteView):
    model = Program
    success_url = reverse_lazy('admin_page')

    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff

锻炼视图(列出,创建,更新,删除):

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)


class ExerciseCreateView(LoginrequiredMixin,CreateView):
    model = Exercise
    fields = ['program','name','description','load_share','breath_method','recovery_method','measure_method','notes','extra_info','reps','sets']
    success_url = reverse_lazy('admin_page')

    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff


class ExerciseUpdateView(LoginrequiredMixin,UpdateView):
    model = Exercise
    fields = ['program','sets']
    success_url = reverse_lazy('admin_page')

    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff


class ExerciseDeleteView(LoginrequiredMixin,DeleteView):
    model = Exercise
    success_url = reverse_lazy('admin_page')

    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff

数据视图:

(我的第一步是为此模型创建一个CreateView,而不是想出如何在Exercise 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 @R_640_4045@ion - {{ 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 %}

将数据表单实现到“练习”列表视图中的最佳方法是什么?

谢谢! (希望我没有错过任何相关代码

我的问题的更新:

因此,昨天,我找到了一种从论坛中的一个问题中将表单插入ListView的方法。 我编辑了ListView:

class ExerciseListView(LoginrequiredMixin,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

添加一个连接到数据模型的FormView,而不是使用get_context_data将其添加到ListView模板中。 我仍然无法弄清的一个问题是如何在我的数据模型(我目前正在做的练习)中分配给exercise属性我有人知道,这将是完美的。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)