【问题标题】:How to pass checkbox field to forms in django如何将复选框字段传递给django中的表单
【发布时间】:2021-06-22 14:57:51
【问题描述】:

我知道这可能是重复的,或者在这里问这样一个简单的问题。如果您知道如何操作并要求提供更多详细信息以帮助我解决问题,请提供帮助。免责声明:我是 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

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

【问题讨论】:

  • self.fields['form'] = forms.ModelChoiceField( queryset=Form.objects.filter(school=school)) 为了过滤school 你的Form 类应该有一个学校字段。
  • @Vincent,是的,它有一个学校领域,只是我没有包括它。
  • 您的 Students 类有一个 school 字段,但没有 Form 类。请添加您的表单类包含的所有字段
  • 你未来的自己可能希望你最好不要将模型命名为“Form”,以避免与 Django 中已经存在的表单层混淆。
  • @Vincent,已添加

标签: python django forms view


【解决方案1】:

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

models.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

forms.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")

views.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>

【讨论】:

  • ,我来实现看看效果。
猜你喜欢
  • 1970-01-01
  • 2021-02-05
  • 2010-12-25
  • 1970-01-01
  • 2021-06-27
  • 2021-05-20
  • 1970-01-01
  • 2020-01-27
  • 2015-06-07
相关资源
最近更新 更多