如何在 Django 中使用复选框小部件从 MultipleChoiceField 保存数据
Posted
技术标签:
【中文标题】如何在 Django 中使用复选框小部件从 MultipleChoiceField 保存数据【英文标题】:how to save data from MultipleChoiceField with checkbox widget in Django 【发布时间】:2012-05-29 17:35:53 【问题描述】:我有一个 Tutor 模型,它有一个 ManyToManyField 到一个名为 Subjects 的模型,我正在尝试使用 MultipleChoiceField 呈现 Tutor 表单,虽然它被正确呈现,但我认为这些值没有保存在数据库中我的观点有问题。
型号供参考
class Subjects(models.Model):
subject = models.CharField(max_length=100)
class TutorProfile(models.Model):
user = models.OneToOneField(User, primary_key=True)
subject = models.ManyToManyField(Subjects)
我已经用一些对象填充了我的主题模型
这是表格,
class TutorForm(forms.Form):
subjectfield = forms.MultipleChoiceField(choices = ((sub.pk, sub.subject) for sub in Subjects.objects.all()), widget=forms.CheckboxSelectMultiple())
这是视图,
def someview(request):
if request.method == 'POST':
form = TutorForm(request.POST)
if form.is_valid():
subjects = form.cleaned_data['subjectfield']
for sub in subjects:
form.subject.add(sub)
form.save()
但是值没有保存在数据库中,请帮助:(
编辑 我终于在 Mohasen Hassani 的回答的帮助下弄明白了
必须按照下面 Mohasen 的回答编辑表格,但必须像这样更改视图,
def someview(request):
if request.method == 'POST':
form = TutorForm(request.POST)
if form.is_valid():
t = TutorProfile(user.username=somebody)
t.save()
subjects_list = request.POST.getlist('subject')
counter = 0
for sub in subjects_list:
sub_pk = subjects_list.__getitem__(counter)
sub_entity = Subjects.objects.get(pk=sub_pk) #The model to which we are related
data.subject.add(sub_entity)
counter = counter+1
【问题讨论】:
【参考方案1】:改变你的形式:
class TutorForm(forms.ModelForm):
class Meta:
fields = ('subject',)
你的看法:
if form.is_valid():
form.save()
【讨论】:
运气不好,表单正在正确呈现,问题在于保存它并且 form.cleaned_data['subjectfield'] 只返回一个值而不是所有选定的值【参考方案2】:将您的表单编辑为:
subjects = forms.ModelMultipleChoiceField(
queryset=Subjects.objects.all(),
widget=forms.CheckboxSelectMultiple)
在视图中: 您必须首先创建/保存没有主题的 TutorProfile,然后单独提供其主题字段。像这样:
def someview(request):
if request.method == 'POST':
form = TutorForm(request.POST)
if form.is_valid():
t = TutorProfile(user.username=somebody)
t.save()
t.subjects = form.cleaned_data['subjects']
【讨论】:
感谢 Mohasen 的回答,这渲染得很好,但值仍然没有保存在数据库中:( 如果此答案中的代码不正确,请投反对票并发布新答案。以上是关于如何在 Django 中使用复选框小部件从 MultipleChoiceField 保存数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用flutter Dropdown小部件从Django REST API端点填充数据