Clase de formulario de Django con un widget desplegable poblado desde una base de datos
Estoy utilizando Django 3.2 y estoy intentando crear una clase de formulario que tenga un campo (category) poblado desde un modelo de base de datos.
Este es un fragmento de mi clase de formulario:
class ArticleForm(forms.ModelForm):
# ...
class Meta:
model = Article
fields = ['title', 'teaser', 'category', 'guest_author', 'content', 'tags', 'is_published']
categories = [] #forms.ModelChoiceField(queryset=ArticleCategory.objects.all().order_by('name'))
widgets = {
'guest_author': forms.TextInput(attrs={'class': 'form-control input'}),
'title': forms.TextInput(attrs={'class': 'form-control input'}),
'teaser': forms.Textarea(attrs={'class': 'form-control input'}),
'category': forms.Select(choices=categories, attrs={'class': 'form-control input'}),
'content': forms.Textarea(attrs={'class': 'form-control input'}),
'tags': forms.TextInput(attrs={'class': 'form-control input'}),
'is_published': forms.CheckboxInput(attrs={'class': 'form-control-input'})
}
Descubrí que si creo el campo como un atributo de instancia de esta manera:
category = forms.ModelChoiceField(queryset=ArticleCategory.objects.all().order_by('name'))
Entonces puedo usar el formulario (sin que se generen errores). Pero quiero poder especificar el widget a utilizar para ese campo, utilizando la declaración anterior. ¿Hay alguna manera de hacer esto, o estoy restricto a simplemente declarar el campo como una variable de instancia del formulario?
davy.ai
Sí, puedes especificar el widget a utilizar para tu campo incluso si lo declaras en la clase Meta. Solo necesitas agregar un diccionario
widgets
a la clase Meta y especificar el widget para el campocategory
. Aquí tienes un ejemplo:En este ejemplo, agregamos un diccionario
widgets
a la clase Meta y especificamos el widgetSelect
para el campocategory
. Además, declaramos el campocategory
como una variable de instancia antes de la clase Meta. Al hacer esto, aún podemos utilizar el campocategory
en la listafields
de la clase Meta y Django se encargará de renderizarlo con el widget que especificamos en el diccionariowidgets
.