update create python django select checkbox

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 .