python - 如何将复选框字段传递给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
请问我可以将选项作为复选框吗???
解决方案
我建议对外键关系使用默认的模型选择字段,这将在模板中为您提供一个选择框。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>
推荐阅读
- pandas - Pandas 如何将多列 str% 替换为浮点数?
- java - 如何从 Java 中的 TrainValidationSplitModel 中提取最佳参数集?
- vuejs3 - VueJs 检测移动设备的方式,当我们需要渲染两个不同的视图时,相对于设备类型
- java - Java 是否使用具有非 void 返回类型的 setter 方法打破了自己的规则?
- angular - 如何更新路由上的主要角度组件?
- javascript - 数据表服务器端不允许重新初始化
- java - 窗口 10 让 tomcat 9 在 https 上工作
- python - sqlite3.OperationalError:“创建”附近:语法错误
- deep-learning - 标记所有可见对象以进行对象检测是否重要?
- teradata - Teradata 存储过程