【发布时间】:2018-08-15 22:08:32
【问题描述】:
我有一个基于类的视图(views.py 中的IndexView),它显示了一个表,其中包含存储在数据库中的所有数据。
此视图在 index.html 中呈现,使用 def get_queryset(self) 获取所有数据。还没有问题。
对我来说困难的部分是尝试使用表单来修改和保存 amount 列。 我对 POST 部分没有任何问题,我使用 AJAX 保存新值。 我遇到的问题是从数据库中获取初始值以填充 Django 表单 (forms.py)
我尝试在表单字段的定义中使用initial 参数(在forms.py),甚至在表单定义中覆盖__init__,但我不知道如何获得“一个价值”。我的意思是,我在测试中越接近使用以下内容填充 MultipleChoiceField:
forms.ModelMultipleChoiceField(queryset=Item.objects.order_by('code__name'))
(实现Item object (1), Item object (2), etc.的多选字段)
但是如何使用数据库的内容填充单个 IntegerField 或 CharField 以在模板中显示基于表单的表格字段?
我首先尝试使用单个项目(尝试了解如何引用一个项目/值以使用数据库填充它们),然后再使用整个表:
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):
...
我检查了这些文档和一些类似的旧问题,但我尝试了一些建议/示例但没有成功:
- https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#a-full-example
- https://www.webforefront.com/django/formprocessing.html
- Pre-populating Django Forms
- Populate a django form with data from database in view
我正在使用 Django 2.0.2
任何帮助将不胜感激。 提前致谢。
编辑: 尝试按照 andi 的建议使用 UpdateView 做某事。添加(尝试通过 id 获取一个值):
class ItemUpdate(UpdateView):
form_class = JoinForm
def get_object(self,queryset=None):
obj = Item.objects.get(id=self.kwargs['2'])
return obj
并将网址指向path('', views.ItemUpdate.as_view(), name='index'),但总是得到KeyError: '2'
【问题讨论】:
-
我不确定在您的情况下使用 django 表单是否准确。对于类似的需求,我使用 jquery editinplace (github.com/siebertm/jquery-edit-in-place):它简单高效。
标签: python django database forms populate