我们如何显示基于 Django 中的用户输入在前端完成的计算结果?



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

到目前为止,我所做的如下。

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>

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

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

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

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

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

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

因此,在您的views.py导入messages库并在redirect之前添加此库

messages.success(request, result)

现在在您的模板中添加

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

我是Django 的新手,但我想我做了一些类似于你想做的事情。 1. 使用与您的模型类似的模型 - 让用户填写表单,然后确保使用表单中的数据填充模型。起初我没有意识到我需要确保表单中的每个字段都已填写,否则不会将任何内容保存到模型中。(它在文档中,我只是没有注意到它(。 2.然后,当我想使用模型中的数据时,我只是确保导入了模型。我还导入了一个单独的 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})

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

看看你的代码,我怀疑你是一个比我更好的程序员,但也许上面可能会有所帮助。在表单中,您只有主题字段,没有用户字段。在我的情况下,我认为这导致我的模型没有被填充。

为了解决我的情况,我必须做的另一件事是摆脱酥脆的形式或小部件,但我认为这并不重要。

最新更新