首页 > 解决方案 > 如何将复选框字段传递给django中的表单

问题描述

我知道这可能是重复的,或者在这里问这样一个简单的事情。如果您知道如何操作并要求提供更多详细信息以帮助我解决问题,请提供帮助。免责声明:我是 django 初学者。

我有一个具有外键字段的模型。我希望将选项传递到复选框中显示的外键字段中。我无法让它工作。这些是我所拥有的

class Students(models.Model):
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    name = models.CharField(max_length=200,unique=True,help_text="Student's name")
    form = models.ForeignKey(Form, on_delete=models.CASCADE)

class Form(models.Model):
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    form = models.CharField(max_length=20)

表单模型中的所有选项都将作为学生模型中的复选框传递

我的 forms.py 如下所示

class StudentsForm(forms.ModelForm):
    def __init__(self, school, *args, **kwargs):
        super(StudentsForm, self).__init__(*args, **kwargs)
        self.fields['form'] = forms.ModelChoiceField(
            queryset=Form.objects.filter(school=school))    
    class Meta:
        model = Students
        fields = ("name",'form')
My views.py     
class StudentView(LoginRequiredMixin,CreateView):
    model = Students
    form_class = StudentsForm
    template_name = 'add_student.html'
    success_url = reverse_lazy('students')

    def get_form_kwargs(self):
        kwargs = super(StudentView, self).get_form_kwargs()
        kwargs['school'] = self.request.user.school
        return kwargs

请问我可以将选项作为复选框吗???

标签: pythondjangoformsview

解决方案


我建议对外键关系使用默认的模型选择字段,这将在模板中为您提供一个选择框。Javascript 不是我最好的编程语言,但这里有一个关于如何设置它的答案:

模型.py

from django.db import models


class School(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Students(models.Model):
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, unique=True, help_text="Student's name")

    def __str__(self):
        return self.name

表格.py

from django import forms

from .models import Students


class StudentsForm(forms.ModelForm):
    school = forms.CharField(widget=forms.HiddenInput)

    class Meta:
        model = Students
        fields = ("name", "school")

视图.py

from django.urls import reverse_lazy
from django.views.generic import FormView

from .forms import StudentsForm
from .models import Students, School


class StudentView(FormView):
    template_name = 'add_student.html'
    model = Students
    form_class = StudentsForm
    success_url = reverse_lazy('students')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['schools'] = School.objects.all()
        return context

add_student.html

<form>
    {{ form.as_p }}

    <ul class="school__list">
        {% for school in schools %}
            <li class="school__list-item">{{ school.name }}
                <input type="checkbox" class="school__list-item-checkbox"
                       value="{{ school.id }}" name="school"/>
            </li>
        {% endfor %}
    </ul>
</form>

<script>
    const schools = document.querySelectorAll('.school__list-item-checkbox');
    for (let i = 0; i < schools.length; i++) {
        schools[i].addEventListener('click', () => {
        {# populate the hidden school field with the value that is checked here. #}
        })
    }
</script>

推荐阅读