python - create - django update object
Django Campo de opción múltiple/Casilla de verificación Seleccionar múltiples (4)
La solución de Brant es absolutamente correcta, pero necesitaba modificarla para que funcione con múltiples casillas de selección y commit=false
. Aquí está mi solución:
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))
Tengo una aplicación Django y quiero mostrar casillas de verificación de opción múltiple en el perfil de un usuario. Luego podrán seleccionar múltiples elementos.
Esta es una versión simplificada de mi 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)
Y mi clase de forma:
class ProfileForm(forms.ModelForm):
choice_field = forms.MultipleChoiceField(choices=SAMPLE_CHOICES, widget=forms.CheckboxSelectMultiple)
class Meta:
model = Profile
Y mi 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))
Puedo ver que el POST solo está enviando un valor:
choice_field u''choice_three''
Y los parámetros vars locales están enviando una lista:
[u''choice_one'', u''choice_two'', u''choice_three'']
Todos los campos del formulario se muestran correctos, pero cuando envío un mensaje POST, aparece un error
Error al vincular el parámetro 7 - probablemente no sea compatible.
¿Necesito procesar el campo de opción múltiple más adelante en la vista? ¿Es correcto el tipo de campo del modelo? Cualquier ayuda o referencia sería muy apreciada.
Las opciones de perfil deben configurarse como ManyToManyField para que esto funcione correctamente.
Entonces ... tu modelo debería ser así:
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)
Luego, sincronice la base de datos y cargue Choices con las diversas opciones que desee.
Ahora, el ModelForm se construirá a sí mismo ...
class ProfileForm(forms.ModelForm):
Meta:
model = Profile
exclude = [''user'']
Y finalmente, la vista:
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))
Debe mencionarse que puede configurar un perfil de dos maneras diferentes, incluida la herencia. Dicho esto, esto también debería funcionar para ti.
Buena suerte.
Los modelos.CharField es una representación de CharField de una de las opciones. Lo que quieres es un conjunto de opciones. Esto no parece ser implementado en django (todavía).
Podría usar un campo de varios para muchos, pero eso tiene la desventaja de que las opciones deben colocarse en una base de datos. Si desea usar opciones codificadas, probablemente esto no sea lo que desea.
Hay un fragmento de django en http://djangosnippets.org/snippets/1200/ que parece resolver su problema, mediante la implementación de un ModelField MultipleChoiceField
.
ManyToManyField no es una buena opción. Puede usar algunos fragmentos para implementar MultipleChoiceField . Puede inspirarse en MultiSelectField con valores separados por comas (Field + FormField) Pero tiene algunos errores. Y puede instalar django-multiselectfield . Esto es más prefecto.