Rellenar previamente la tabla de formulario HTML de la base de datos usando Django
Tengo una vista basada en clases (IndexView aviews.py) que muestra una tabla con todos los datos almacenados en la base de datos. Esta vista se representa enindex.html usando undef get_queryset(self)
para obtener todos los datos. Aún no hay problemas.
La parte difícil para mí es intentar hacerlo usando un formulario, para poder modificar y guardar elcantidad columna. No tengo problemas con la parte POST, donde uso AJAX para guardar los nuevos valores. Donde tengo problemas es obtener los valores iniciales de la base de datos para completar un formulario de Django (formas.py)
Traté de usarinitial
argumento en la definición de los campos de formulario (enformas.py), incluso anulando__init__
en la definición del formulario,pero no sé cómo obtener "un valor". Quiero decir, cuanto más cerca estuve en mis pruebas estaba poblando unMultipleChoiceField con:forms.ModelMultipleChoiceField(queryset=Item.objects.order_by('code__name'))
(logrando un campo de opción múltiple deItem object (1), Item object (2), etc.
)
¿Pero cómo pueblas una solaIntegerField oCharField con el contenido de la base de datos para mostrar un campo de tabla basado en formularios en la plantilla?
Primero estoy intentando con un solo elemento (para tratar de entender cómo hacer referencia a un elemento / valor para llenarlos usando la base de datos) antes de hacerlo con toda la tabla:
index.hml:
...
<form class='my-ajax-form' method='POST' action='.' data-url='{{ request.build_absolute_uri|safe }}'>
{% csrf_token %}
{{form.as_table|safe}}
<button type='submit'>Save changes</button>
</form>
...
modelos.py:
class Code(models.Model):
name = models.CharField(max_length=6)
description = models.CharField(max_length=100)
def __str__(self):
return self.name
class Item(models.Model):
code = models.ForeignKey(Code, on_delete=models.DO_NOTHING)
amount = models.IntegerField(default=0)
formas.py:
class ItemForm(forms.Form):
code = forms.CharField(max_length=6)
description = forms.CharField(max_length=100)
amount = forms.IntegerField()
views.py:
class IndexView(generic.ListView, AjaxFormMixin, FormView):
template_name = 'inventory/index.html'
context_object_name = 'items_list'
form_class = ItemForm
def form_invalid(self, form):
...
def form_valid(self, form):
...
def get_queryset(self):
...
Revisé estos documentos y algunos problemas antiguos similares, pero probé algunas de las sugerencias / ejemplos sin éxito:
https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#a-full-examplehttps://www.webforefront.com/django/formprocessing.htmlFormas pre-pobladas de DjangoRellene un formulario de django con datos de la base de datos a la vistaEstoy usando Django 2.0.2
Cualquier ayuda sería apreciada. Gracias por adelantado.
EDITAR: Intentar hacer algo usando UpdateView como sugiere andi. Agregado (tratando de obtener un valor por id):
class ItemUpdate(UpdateView):
form_class = JoinForm
def get_object(self,queryset=None):
obj = Item.objects.get(id=self.kwargs['2'])
return obj
Y apuntó url apath('', views.ItemUpdate.as_view(), name='index')
pero siempre obtenerKeyError: '2'