Я имею приложение 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)
И мой класс формы:
class ProfileForm(forms.ModelForm):
choice_field = forms.MultipleChoiceField(choices=SAMPLE_CHOICES, widget=forms.CheckboxSelectMultiple)
class Meta:
model = Profile
И мой 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))
Я вижу, что POST только отправляет одно значение:
choice_field u'choice_three'
И локальные параметрические усилители Вара отправляют список:
[u'choice_one', u'choice_two', u'choice_three']
Все поля формы отображаются корректный, но когда я отправляю сообщение, я получаю ошибку
Ошибка обязательный параметр 7 - вероятно, неподдерживаемый тип.
Я должен обработать поле разнообразного выбора далее в представлении? Образцовый тип поля корректен? Любая справка или ссылки значительно ценились бы.
Для правильной работы параметры профиля должны быть настроены как 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)
Затем синхронизируйте базу данных и загрузите Choices с различными опциями, которые вы хотите получить.
Теперь ModelForm создаст себя ...
class ProfileForm(forms.ModelForm):
Meta:
model = Profile
exclude = ['user']
И, наконец, представление:
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))
Следует упомянуть, что вы можете настроить профиль несколькими способами, включая наследование. Тем не менее, это должно сработать и для вас.
Удачи.
Решение Бранта абсолютно правильное, но мне нужно было изменить его, чтобы заставить его работать с несколькими флажками выбора и 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)
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']
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))