首页 > 解决方案 > 如何从我的数据库中实现 django 中的复选框

问题描述

我需要为教师管理做一个项目。我做了一个项目,从我的数据库中选择 3 个表。我的页面上有 3 个 ModelChoiceField 和一个提交按钮。当我单击提交时,我需要重定向到一个新页面,该页面具有与我从 3 个选择字段中的选择相关的复选框列表。

模型.py:

class An(models.Model):
    an_studiu = models.SmallIntegerField(primary_key=True)

    class Meta:
        managed = False
        db_table = 'an'
    def __str__(self):
        strAni = ["0", "I", "II", "III", "IV", ]
        return strAni[self.an_studiu]


class Disciplina(models.Model):
    id = models.CharField(primary_key=True, max_length=256)
    denumire = models.CharField(max_length=256, blank=True, null=True)
    an_studiu = models.ForeignKey(An, models.DO_NOTHING, db_column='an_studiu', blank=True, null=True)
    id_program_studii = models.ForeignKey('ProgramStudii', models.DO_NOTHING, db_column='id_program_studii', blank=True, null=True)
    pondere_evaluare = models.FloatField(blank=True, null=True)
    nr_lucrari = models.IntegerField(blank=True, null=True)
    nr_teme = models.IntegerField(blank=True, null=True)
    nr_evaluari = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'disciplina'


class Incadrare(models.Model):
    semigrupa = models.ForeignKey('Semigrupa', models.DO_NOTHING, db_column='semigrupa', blank=True, null=True)
    id_disciplina = models.ForeignKey(Disciplina, models.DO_NOTHING, db_column='id_disciplina', blank=True, null=True)
    id_profesor = models.ForeignKey('Profesor', models.DO_NOTHING, db_column='id_profesor', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'incadrare'


class ProgramStudii(models.Model):
    id = models.CharField(primary_key=True, max_length=256)
    abreviere = models.CharField(max_length=256, blank=True, null=True)
    denumire = models.CharField(max_length=256, blank=True, null=True)
    nr_ani_studiu = models.SmallIntegerField(blank=True, null=True)
    def __str__(self):
        return self.abreviere

    class Meta:
        managed = False
        db_table = 'program_studii'


class Semigrupa(models.Model):
    id = models.CharField(primary_key=True, max_length=6)

    class Meta:
        managed = False
        db_table = 'semigrupa'

表格.py:

from django import forms
from .models import An, ProgramStudii,Disciplina
#from django.forms.widgets import SubWidget

class F1Form (forms.Form):
    disciplina = forms.ModelChoiceField(queryset=Disciplina.objects.all().order_by('id'), to_field_name="denumire")
    program = forms.ModelChoiceField(queryset=ProgramStudii.objects.all().order_by('id'), to_field_name="abreviere")
    an = forms.ModelChoiceField(queryset=An.objects.all().order_by('an_studiu'))


    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

#class F2Form(forms.Form):

视图.py:

from django.forms import forms
from django.http import HttpResponseRedirect
from django.shortcuts import render

# Create your views here.
from django.views import View
from django.views.generic import ListView, CreateView, UpdateView, TemplateView
from django.urls import reverse_lazy
from .models import ProgramStudii
from .forms import F1Form

class ProgrameListView(ListView):
    model = ProgramStudii
    context_object_name = 'programe'

class F1(View):
    form_class = F1Form
    #success_url = reverse_lazy('rezultat')
    template_name = 'afdmpq1/f1_form.html'
    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            # <process form cleaned data>
            return HttpResponseRedirect('/f2_form.html/')

        return render(request, self.template_name, {'form': form})

class F2(View):
    form=F1Form

def rezultat(request):
    return render(request, 'afdmpq1/f2_form.html', {} )

def rezultat2(request):
    return render(request,'afdmpq1/f3_form.html',{})

f1_form.html:

{% extends 'base.html' %}

{% block content %}

  <h2>F1 Form</h2>

  <form method="post" id="f1Form" action ="{% url 'afdmpq1:rezultat' %}" novalidate>
    {% csrf_token %}
    <table>
      {{ form.as_table }}
    </table>
    <button type="submit">Pasul urmator</button>
  </form>
{% endblock %}

网址.py

from django.urls import path
from . import views
app_name ='afdmpq1'
urlpatterns = [
    path('f1/', views.F1.as_view(), name='f1'),
    path('', views.ProgrameListView.as_view(), name='incadrare_changelist'),
    #path('<int:nr>/<int:nr1>/rezultat', views.rezultat, name='rezultat'),
    path('rezultat/', views.rezultat, name='rezultat'),
    path('f2/',views.F2.as_view(),name='f2')
]

复选框来自表 Semigrupa。我想在页面上显示 Semigrupa 表中的所有数据,但它们需要是复选框。我听说你可以使用 BooleanField() 但我不知道如何实现它。

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-forms

解决方案


您可以尝试使用CheckboxSelectMultiple小部件。

forms.py 会变成:

from django import forms
from .models import An, ProgramStudii,Disciplina
#from django.forms.widgets import SubWidget

class F1Form (forms.Form):
    disciplina = forms.ModelChoiceField(queryset=Disciplina.objects.all().order_by('id'), to_field_name="denumire", widget=forms.CheckboxSelectMultiple())
    program = forms.ModelChoiceField(queryset=ProgramStudii.objects.all().order_by('id'), to_field_name="abreviere", widget=forms.CheckboxSelectMultiple())
    an = forms.ModelChoiceField(queryset=An.objects.all().order_by('an_studiu'), widget=forms.CheckboxSelectMultiple())


    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

推荐阅读