【问题标题】:how to save data from MultipleChoiceField with checkbox widget in Django如何在 Django 中使用复选框小部件从 MultipleChoiceField 保存数据
【发布时间】: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

【问题讨论】:

    标签: django django-models django-forms django-views django-orm


    【解决方案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 的回答,这渲染得很好,但值仍然没有保存在数据库中:(
    • 如果此答案中的代码不正确,请投反对票并发布新答案。
    猜你喜欢
    • 2022-10-02
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2019-12-06
    相关资源
    最近更新 更多