TransWikia.com

¿Cómo puedo pasar un parámetro por URL a una CreateView en django 3.0 para utilizarla como valor "default" en uno de los campos del formulario?

Stack Overflow en español Asked by Guillermo Báez Ramos on March 15, 2021

Llevo poco tiempo programando con django (concretamente con la versión 3.0) y llevo varios días intentando enviar un parámetro por url a una vista CreateView y no he encontrado la manera de hacerlo, a pesar de revisar varios ejemplos en Stackoverflow.
Desde un template autor_detail.html, donde muestro los datos de un Autor, tengo el enlace a la vista LibroAutorCreateView donde quiero capturar los datos del Libro sin tener que volver a especificar el Autor, porque lo envío en la Url desde la vista autor_detail.html, pero hasta ahora no he conseguido capturar y procesar el parámetro y pasarlo al formulario ¿Cómo puedo hacerlo? ¿Alguine sugiere alguna vía mejor?
Gracias de antemano, Guillermo

models.py 

class Autor(models.Model):
    nombre = models.CharField(max_length = 150)
    pais = models.CharField(max_length = 50)

class Libro(models.Model):
    autor = models.ForeignKey("proyecto.Autor", verbose_name="Autor", on_delete=models.CASCADE)
    titulo = models.CharField(max_length = 150)
    editorial = models.CharField("Editorial", max_length=150)
    anio = models.DateField("Año de publicación", auto_now=False, auto_now_add=False)
   
forms.py

class LibroAutorForm(forms.ModelForm):
    class Meta:
        model = Libro
        fields = ['autor','titulo', 'editorial', 'anio']
    def __init__(self, *args, **kwargs):
        autor.default = kwargs.pop('pk') # La idea es usar el id del autor que paso por parámetro, para que al menos me salga como "default" en el select del template, pero me da como error: "name 'autor' is not defined"
        #self.fields['autor'].default = kwargs.pop('pk') # Esto tampoco ha funcionado da el error: "'LibroAutorForm' object has no attribute 'fields'"
        super(LibroAutorForm, self).__init__(*args, **kwargs)        
        
 
urls.py
  
    path("libros/create/<int:pk>/", views.LibroAutorCreateView.as_view(), name="librosAutor-create"),
  
views.py
 
class LibroAutorCreateView(CreateView):
    model = Libro
    form_class = LibroAutorForm
    
    def get_form_kwargs(self):
        kwargs = super(LibroAutorFormCreateView, self).get_form_kwargs()
        kwargs.update(self.kwargs)  
        return kwargs    

One Answer

suponiendo que sin problemas recuperas el parámetro por url en la vista, para enviar esto al formulario, debes de hacerlo en un diccionario ejemplo:

def get_form_kwargs(self):
        kwargs = super(LibroAutorCreateView, self).get_form_kwargs()
        kwargs.update({
            'pk': self.kwargs['pk'],
        })
        return kwargs

// en el form.py

def __init__(self, pk, *args, **kwargs):
        tu_variable = pk
        super(LibroAutorForm, self).__init__(*args, **kwargs)

Aunque no estoy seguro de si en la ultima versión de Django un CreateView puede recibir parámetro por url, si no es así, puedes usar un FormView en vez de CreateView

Answered by cscthian on March 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP