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
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP