Django – Modificar widget Select lista personalizada?

publicado por: Anonymous

Muy buenas , quisiera saber como modificar mi select con una consulta modificada , me hago explicar…

models.py

class Equipo(models.Model):
    nombre = models.CharField(max_length=200)
    color = RGBColorField()
    torneo = models.ForeignKey(Torneo, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return (self.nombre)

forms.py

class Equipo_Form(forms.ModelForm):
    class Meta:
        model = Equipo
        fields =[
            'nombre',
            'color',
            'torneo',
        ]

        labels={
            'nombre':'Nombre del Equipo',
            'color':'Color Uniforme',
            'torneo':'Participar Torneo',
        }

        widgets={
            'nombre': forms.TextInput(attrs={'class':'form-control'}),
            'color': RGBColorField(),
            'torneo': forms.Select(attrs={'class':'form-control'}),
        }

De esta manera me muestra en mi widget forms.Select Todos los torneos existentes sin importar el usuario , quiero que me muestre la lista de torneos creados por el usuario.

Tengo una vista de tipo listView donde muestra los torneos segun el usuario logueado esta asi:

views.py

class Torneo_ListView(ListView):    
    template_name = 'torneos/torneo_listar.html'

    def get_queryset(self, *args, **kwargs):
        return Torneo.objects.filter(user=self.request.user) 

alguna forma de filtrar en mi models.select una lista de torneos segun el usuario.

Sé que con el “chouce” son los valores a mostrar pero no se como integrar el usuario a la consulta

widgets={
    'torneo': forms.Select(chouse=Torneos.objects.filter(user=¿??)attrs={'class':'form-control'}),
        }

que deberia ir ahi , eh intentado “(user=self.request.user)” igual que en la ListView pero obviamente no funciona.

Consulte en la documentacion de la clase Select https://docs.djangoproject.com/en/1.10/_modules/django/forms/widgets/#Select

no entiendo muy bien como aplicarlo , Antemano pido disculpas si la solucion es facil y no supe arreglarlo.

SOLUCION:

views.py

class Equipo_CreateView(CreateView):
    model = Equipo
    template_name = "torneos/equipo_crear.html"
    form_class = Equipo_Form
    success_url = reverse_lazy('torneos:equipo_crear')

    def get_form_kwargs(self):
        kwargs = super(Equipo_CreateView, self).get_form_kwargs()
        kwargs.update({'request': self.request})

    def form_valid(self, form_class):
        form_class.instance.user_id = self.request.user.id
        return super(Equipo_CreateView, self).form_valid(form_class)

forms.py

class Equipo_Form(forms.ModelForm):

    def __init__(self, request, *args, **kwargs):
        super(Equipo_Form, self).__init__(*args, **kwargs)
        self.fields['torneo'].queryset =  Torneo.objects.filter(user=request.user)

    class Meta:
        model = Equipo
        fields =[
            'nombre',
            'color',
            'torneo',
        ]

        labels={
            'nombre':'Nombre del Equipo',
            'color':'Color Uniforme',
            'torneo':'Participar Torneo',
        }


        widgets={
            'nombre': forms.TextInput(attrs={'class':'form-control'}),
            'color': RGBColorField(),
        }

solución

Cuando trabajas con select que vienen de un modelo, no es necesario que uses un widget Select, Django un día creó un widget mágico llamado ModelChoiceField el cual se encarga de renderizar un queryset haciendolo select y options, Dicho widget, ya viene por default cuando generas un ModelForm, por lo que no necesitas especificarlo. Es decir, en tu archivo de forms.py, en la linea donde pones el widget de torneo a un select, podrías eliminarla y añadir lo siguiente:

...
def __init__(self, request, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['torneo'].queryset = Torneo.objects.filter(user=request.user)
...

Y lo unico que debes de tener en cuenta es que ahora cada vez que uses en tu vista el formulario, debes agregarle la petición, de esta forma:

class Equipo_CreateView(CreateView):
    ...
    def get_form_kwargs(self):
       kwargs = super().get_form_kwargs()
       kwargs.update({'request': self.request})
       return kwargs
...

Espero haberte ayudado. Cualquier duda, comenta.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *