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)
应该提到的是,您可以通过几种不同的方式设置配置文件,包括继承.也就是说,这对你也有用.
祝好运.
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.
| 归档时间: |
|
| 查看次数: |
96021 次 |
| 最近记录: |