我们如何根据 Django 中的用户输入在前端显示计算结果?

How do we show the result of calculation on Front End done based on the user input in Django?

我正在做一个 Django 项目,学生将在表格中写下 his/her 课程名称,然后单击“计算”按钮,系统将使用模糊逻辑根据该特定课程的详细信息,然后在“计算”按钮下方显示该计算的结果。

我目前所做的如下。

views.py:

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import PerformanceCalculatorForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from .models import Subject, Detail
from .fuzzy_logic_algo import fuzz_algo


def performanceCalculator(request):
    if request.method == 'POST':
        performance_form = PerformanceCalculatorForm(request.POST)

        if performance_form.is_valid():
            sub = performance_form.cleaned_data.get('subject')

        skype = Details.objects.filter(subject__subject=sub, user__username=User.username).get('skype_session_attendance')
        internal_course = Details.objects.filter(subject__subject=sub, user__username=User.username).get('internal_course_marks')
        prg_lab = Details.objects.filter(subject__subject=sub, user__username=User.username).get('programming_lab_activity')
        mid_marks = Details.objects.filter(subject__subject=sub, user__username=User.username).get('mid_term_marks')
        final_marks = Details.objects.filter(subject__subject=sub, user__username=User.username).get('final_term_marks')

        result = fuzz_algo(skype, internal_course, prg_lab, mid_marks, final_marks)

        context = {
            'result': result,
        }

        return render(request, 'users/performance_calculator.html', context)
    else:
        performance_form = PerformanceCalculatorForm()

    return render(request, 'users/performance_calculator.html', {'performance_form': performance_form})

models.py:

from django.db import models
from django.contrib.auth.models import User
from PIL import Image

class Subject(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.CharField(max_length=100)

    def __str__(self):
        return '{} ({})'.format(self.subject, self.user.username)


class Detail(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.OneToOneField(Subject, on_delete=models.CASCADE)
    skype_session_attendance = models.FloatField()
    internal_course_marks = models.FloatField()
    programming_lab_activity = models.FloatField()
    mid_term_marks = models.FloatField()
    final_term_marks = models.FloatField()

    def __str__(self):
        return f'{self.subject, (self.user.username)} Details'

forms.py:

from django import forms

class PerformanceCalculatorForm(forms.Form):
    class Meta:
        fields = ['subject']

performance_calculator.html:

{% load static %}
<!DOCTYPE html>
<html>
    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
        <link rel="stylesheet" type="text/css" href="{% static 'esacp/main.css' %}">

        <title>Expert System for Assessing Programming Course Performance</title>

    </head>

    <body>
        <main role="main" class="container">
            <div class="row">
                <div class="col-md-8">
                    {% if messages %}
                        {% for message in messages %}
                            <div class="alert alert-{{ message.tags }}">
                                {{ message }}
                            </div>
                        {% endfor %}
                    {% endif %}

                    {% if not request.user.is_superuser and not request.user.is_staff %}
                        <div class="account-heading">
                            <h2>
                                Performance Calculator
                            </h2>
                        </div>

                        <div class="content-section">
                            <form method="POST">
                                {% csrf_token %}
                                <fieldset class="form-group">
                                    <legend class="border-bottom mb-4">Profile</legend>
                                    {{ performance_form|crispy }}
                                    {{ result }}
                                </fieldset>
                            </form>
                        </div>
                    {% endif %}
                </div>                
            </div>
        </main>

        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    </body>
</html>

谁能告诉我,当 he/she 在 .../performance_calculator.html 时,用户(学生)在表格中输入课程名称,他的记录被保存,并与分配给他的课程,在匹配之后,选修该课程的学生的 activity 详细信息,这些被分配给单独的变量,这些变量被传递给 fuzz_algo() 函数,然后是该函数的结果打印在前端?

我从 2 天开始就一直在研究它,但没有得到它。任何帮助都将不胜感激。

让我先解决一些真正有问题的事情。您的 PerformanceCalculator 视图,在 POST 条件下,您永远不会 save() 表单,因此您的下一个查询将 return 空对象,我相信 fuzz_algo将 return None(假设)并且在渲染器上不显示任何内容。

实际上最佳做法是:在 POST 条件语句的最后一行,使用 redirect 而不是 render,因为它会再次加载没有 [=45= 的页面]数据。

而且我认为您已经尝试了以上所有操作(因为您说您已经尝试了 2 天),但想知道为什么它仍然没有呈现任何内容,因为到 redirect 它会通过 GET 请求再次询问并且会丢失变量 result.

中的数据

现在有了 "not so important" 问题,正如我在您的代码中看到的那样,您无意将表单保存在数据库中,这可能是客户端而不是服务器端的更好方法。要在服务器端执行此操作,请检查 https://docs.djangoproject.com/en/3.0/topics/http/sessions/ 以使用会话变量使其保持活动状态并且在 redirect 之后不会丢失,还有一个简单的解决方法(但并非在所有情况下都有效)是到 .. 比方说 "abuse" messagesdjango,它将在您下一次加载时向客户端传递一条消息。

因此在您的 views.py 上导入 messages 库并在 redirect

之前添加它
messages.success(request, result)

现在在你的模板中添加这个

  {% if messages %}
      {% for message in messages %}
          {{ message }}
      {% endfor %}
  {% endif %}

我是 Django 的新手,但我想我做了一些类似于您正在尝试做的事情。 1. 使用类似于您的模型 - 让用户填写表单,然后确保模型中填充了表单中的数据。起初我没有意识到我需要确保表单中的每个字段都已填写,否则不会将任何内容保存到模型中。 (它在文档中,我只是没有接受它)。 2. 然后当我想使用模型中的数据时,我只是确保模型是 imported.I 还导入了一个单独的 python 文件来对参数进行计算。

然后在视图中我分配了一个变量 = 给模型对象,例如模型 Search_Profile 在我的例子中我有

params=Search_Profile.objects.last()  

因为在我的例子中,我只想要最后一个配置文件,但您可以将其设为您想要的任何对象。

有了这些信息,我就可以从 .py 文件中导入函数在我的例子中

C=calculate(params.keyword_string,params.other_string)

那时我可以使用参数和 .py 文件中计算函数所需的任何内容渲染模板

return render(request,'mainapp/show_calculation.html',{'params':params,'new_entries':new_entries,'C':C})

我花了一段时间才发现这行得通,也许还有更好的方法,但它至少对我想做的事情有效。

查看您的代码,我怀疑您的编码能力比我好,但以上内容可能会有所帮助。在您的表单中,您只有主题字段而没有用户字段。在我的情况下,我认为这导致我的模型没有被填充。

为了解决我的问题,我必须做的另一件事是摆脱脆皮形式或 widget-tweeks,但我认为这并不重要。