Digamos que tengo algunos modelos artificiales:Cómo modificar opciones de ModelMultipleChoiceField
class Author(Model):
name = CharField()
class Book(Model):
title = CharField()
author = ForeignKey(Author)
Y digamos que quiero usar un ModelForm de libro:
class BookForm(ModelForm):
class Meta:
model = Book
simple hasta el momento. Pero también digamos que tengo un montón de Autores en mi base de datos, y no quiero tener un campo de selección múltiple tan largo. Entonces, me gustaría restringir el queryset en el campo de autor ModelFieldMultipleChoiceField de BookForm. Digamos también que el conjunto de interrogación que deseo no se puede elegir hasta __init__
, ya que depende de un argumento para pasar.
Esto parece que podría hacer el truco:
class BookForm(ModelForm):
class Meta:
model = Book
def __init__(self, letter):
# returns the queryset based on the letter
choices = getChoices(letter)
self.author.queryset = choices
Por supuesto, si eso sólo funcionó yo no estaría aquí. Eso me da un AttributeError. El objeto 'BookForm' no tiene ningún atributo 'autor'. Por lo tanto, también probé algo como esto, donde intento de anular campo predeterminado de la ModelForm y luego configurarlo más tarde:
class BookForm(ModelForm):
author = ModelMultipleChoiceField(queryset=Author.objects.all())
class Meta:
model = Book
def __init__(self, letter):
choices = getChoices(letter)
self.author.queryset = choices
que produce el mismo resultado.
¿Alguien sabe cómo se debe hacer esto?
Sí, mi área de problema real tiene la llamada de superclase, pero me salté este ejemplo. – Brian
Bastante justo. Dejaré esto para cualquiera que deambule en esta pregunta por referencia, supongo. –
Definitivamente. Es importante ver que el super() .__ init __() debe ocurrir antes del acceso a los campos. – Brian