Django多选字段/复选框选择多个

twa*_*pss 35 python django checkbox select

我有一个Django应用程序,并希望在用户的配置文件中显示多个选项复选框.然后他们将能够选择多个项目.

这是我的models.py的简化版本:

from profiles.choices import SAMPLE_CHOICES

class Profile(models.Model):
    user = models.ForeignKey(User, unique=True, verbose_name_('user'))
    choice_field = models.CharField(_('Some choices...'), choices=SAMPLE_CHOICES, max_length=50)
Run Code Online (Sandbox Code Playgroud)

我的表格类:

class ProfileForm(forms.ModelForm):
    choice_field = forms.MultipleChoiceField(choices=SAMPLE_CHOICES, widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Profile
Run Code Online (Sandbox Code Playgroud)

和我的views.py:

if request.method == "POST":
    profile_form = form_class(request.POST, instance=profile)
    if profile_form.is_valid():
        ...
        profile.save()
return render_to_response(template_name, {"profile_form": profile_form,}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

我可以看到POST只发送一个值:

choice_field u'choice_three' 
Run Code Online (Sandbox Code Playgroud)

当地的vars params正在发送一份清单:

[u'choice_one', u'choice_two', u'choice_three']
Run Code Online (Sandbox Code Playgroud)

所有表单字段都显示正确,但是当我提交POST时,我收到错误

错误绑定参数7 - 可能不受支持的类型.

我是否需要在视图中进一步处理多选字段?模型字段类型是否正确?任何帮助或参考将不胜感激.

Bra*_*ant 34

配置文件选项需要设置为ManyToManyField才能使其正常工作.

那么......你的模型应该是这样的:

class Choices(models.Model):
  description = models.CharField(max_length=300)

class Profile(models.Model):
  user = models.ForeignKey(User, blank=True, unique=True, verbose_name='user')
  choices = models.ManyToManyField(Choices)
Run Code Online (Sandbox Code Playgroud)

然后,同步数据库并使用您想要的各种选项加载选项.

现在,ModelForm将自己构建......

class ProfileForm(forms.ModelForm):
  Meta:
    model = Profile
    exclude = ['user']
Run Code Online (Sandbox Code Playgroud)

最后,观点:

if request.method=='POST':
  form = ProfileForm(request.POST)
  if form.is_valid():
    profile = form.save(commit=False)
    profile.user = request.user
    profile.save()
else:
  form = ProfileForm()

return render_to_response(template_name, {"profile_form": form}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

应该提到的是,您可以通过几种不同的方式设置配置文件,包括继承.也就是说,这对你也有用.

祝好运.

  • 请注意,当您使用save(commit = false)时,需要在表单实例上调用save_m2m(),否则将无法保存对关系的更改.见http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method (5认同)

twa*_*pss 16

Brant的解决方案绝对正确,但我需要修改它以使其适用于多个选择复选框和commit=false.这是我的解决方案:

models.py

class Choices(models.Model):
    description = models.CharField(max_length=300)

class Profile(models.Model):
   user = models.ForeignKey(User, blank=True, unique=True, verbose_name_('user'))
   the_choices = models.ManyToManyField(Choices)
Run Code Online (Sandbox Code Playgroud)

forms.py

class ProfileForm(forms.ModelForm):
    the_choices = forms.ModelMultipleChoiceField(queryset=Choices.objects.all(), required=False, widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Profile
        exclude = ['user']
Run Code Online (Sandbox Code Playgroud)

views.py

if request.method=='POST':
    form = ProfileForm(request.POST)
    if form.is_valid():
        profile = form.save(commit=False)
        profile.user = request.user
        profile.save()
        form.save_m2m() # needed since using commit=False
    else:
        form = ProfileForm()

return render_to_response(template_name, {"profile_form": form}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)


Web*_*ast 13

models.CharField是其中一个选项的CharField表示.你想要的是一组选择.这似乎没有在django中实现.

可以使用多对多字段,但这样做的缺点是必须将选择放在数据库中.如果您想使用硬编码选项,这可能不是您想要的.

有一个在一个Django片断http://djangosnippets.org/snippets/1200/确实似乎解决您的问题,通过实施ModelFieldMultipleChoiceField.