Preencher previamente a tabela de formulários HTML do banco de dados usando o Django
Eu tenho uma visão baseada em classe (IndexView àsviews.py) que mostra uma tabela com todos os dados armazenados no banco de dados. Essa visualização é renderizada emindex.html usando umdef get_queryset(self)
para obter todos os dados. Ainda não há problemas.
A parte difícil para mim é tentar fazer isso usando um formulário, para poder modificar e salvar omontante coluna. Não tenho problemas com a parte POST, onde uso o AJAX para salvar os novos valores. Onde estou tendo problemas é obter os valores iniciais do banco de dados para preencher um formulário do Django (forms.py)
Eu tentei usarinitial
argumento na definição dos campos do formulário (emforms.py), mesmo substituindo__init__
na definição do formulário,mas não sei como obter "um valor". Quero dizer, quanto mais perto eu estive nos meus testes, estava preenchendo umMultipleChoiceField com:forms.ModelMultipleChoiceField(queryset=Item.objects.order_by('code__name'))
(alcançar um campo de múltipla escolha deItem object (1), Item object (2), etc.
)
Mas como você preenche um únicoCampo inteiro ouCharField com o conteúdo do banco de dados para mostrar um campo de tabela baseado em formulário no modelo?
Estou tentando primeiro com um único item (para tentar entender como referenciar um item / valor para preenchê-los usando o banco de dados) antes de fazer isso com a tabela inteira:
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>
...
models.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)
forms.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):
...
Verifiquei esses documentos e alguns problemas antigos semelhantes, mas tentei algumas das sugestões / exemplos sem sucesso:
https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#a-full-examplehttps://www.webforefront.com/django/formprocessing.htmlPré-preenchendo Django FormsPreencher um formulário django com dados do banco de dados em exibiçãoEstou usando o Django 2.0.2
Qualquer ajuda seria apreciada. Desde já, obrigado.
Edição: tentando fazer algo usando o UpdateView como andi sugere. Adicionado (tentando obter um 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
E apontou o URL parapath('', views.ItemUpdate.as_view(), name='index')
mas sempre pegueKeyError: '2'