Django POST 或 GET

Django POST or GET

我有一个页面供老师输入学生的分数和注册号.. 输入后,它会存储在数据库中,学生可以填写一张表格,要求 D.O.B 和注册号,并根据数据库中的特定注册获得分数..

但是当我用post请求学生时,它显示表格无效并说注册号已经存在..

我的views.py:

from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Mark
from django.contrib.auth.views import LoginView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import FormView
from .forms import ViewResultForm, AddResultForm
from django.contrib import messages



class ViewResultFormView(FormView):
    template_name = 'main/home.html'
    form_class = ViewResultForm
    success_url= 'result'

    def form_valid(self, form):
        global registration_number
        global dob
        registration_number = form.cleaned_data['registration_number']
        dob = form.cleaned_data['dob']
        return super(ViewResultFormView, self).form_valid(form)


class MarkListView(ListView):
    model = Mark
    template_name = "main/result.html"
    context_object_name = 'result'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['result'] = context['result'].get(registration_number=registration_number, dob=dob)
        return context

class MarkCreateView(LoginRequiredMixin, CreateView):
    model = Mark
    template_name = "main/add.html"
    form_class = AddResultForm

    def form_valid(self, form):

        total_10th = ((form.cleaned_data['class_10_sub_1'] + form.cleaned_data['class_10_sub_2'] + form.cleaned_data['class_10_sub_3'])/300)*30

        total_11th = ((form.cleaned_data['class_11_English'] + form.cleaned_data['class_11_Maths'] +form.cleaned_data['class_11_Physics'] +form.cleaned_data['class_11_Chemistry'] +form.cleaned_data['class_11_Comp_Bio'])/500) * 30

        total_12th = ((form.cleaned_data['class_12_English'] + form.cleaned_data['class_12_Physics'] +form.cleaned_data['class_12_Chemistry'] +form.cleaned_data['class_12_Maths']+ form.cleaned_data['class_12_Comp_Bio'] +  form.cleaned_data['class_12_practicals_Physics'] + form.cleaned_data['class_12_practicals_Chemistry'] + form.cleaned_data['class_12_practicals_Comp_Bio'] )/500)*40
        
        result = total_10th + total_11th + total_12th
        total = form.save(commit=False)
        total.teacher_name = self.request.user
        total.result = result
        total.save()
        message = messages.success(self.request, f'Result added successfully')
        return super().form_valid(form)



class CustomLoginView(LoginView):
    template_name = 'main/login.html'
    fields = '__all__'
    redirect_authenticated_user = True


    def get_success_url(self):
        return reverse_lazy('add')

home.html:

{% extends 'main/base.html' %}
{%load crispy_forms_tags %} 

{% block content %}

<div  class="container mt-5 card shadow p-3 mb-5 bg-white rounded">

        <legend>Enter your credentials</legend>

        <form  method="POST">
        
        {% csrf_token %}
        {{ form | crispy }}


        <input class='btn btn-outline-info' type="submit" value="Submit">
        
        </form>
</div>  

{% endblock content %}

result.html:

{% extends 'main/base.html' %}

{% block content %}

<div class="container">
{{ result.student_name }}
<br>
{{ result.dob }}
<br>
{{ result.result }} %

</div>

{% endblock content %}

因此,一旦老师输入了学生的分数,我就会计算结果并将其存储在数据库中。但是老师已经注册了一个特定的注册号,当学生尝试输入时,它显示表格无效表格中相同的注册号..我希望注册号是唯一的..

所以如果我必须在 home.html 中使用 GET,如何访问表单的值?

您应该重写您的 ViewResultFormView.form_valid,因为您不希望 form.save()super 调用中被调用。您应该从表单中检索 registration_numberdob,然后用相应学生的成绩填充模板的上下文。

我也不明白那些 global 黑客是干什么用的?如果您需要为多个站点页面存储该信息,那么您应该为学生实施自己的身份验证,将他们的身份验证 tokens/cookies 存储在某处,然后使用该身份验证信息 allow/deny 访问某些页面.