es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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 campo category. Aquí tienes un ejemplo:

    class ArticleForm(forms.ModelForm):
        class Meta:
            model = Article
            fields = ['title', 'teaser', 'category', 'guest_author', 'content', 'tags', 'is_published']
    
            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(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'})
            }
    
        category = forms.ModelChoiceField(queryset=ArticleCategory.objects.all().order_by('name'))
    
    

    En este ejemplo, agregamos un diccionario widgets a la clase Meta y especificamos el widget Select para el campo category. Además, declaramos el campo category como una variable de instancia antes de la clase Meta. Al hacer esto, aún podemos utilizar el campo category en la lista fields de la clase Meta y Django se encargará de renderizarlo con el widget que especificamos en el diccionario widgets.

Comments are closed.