在Django 1.10中,我正在使用数据库中的记录来预填充模板中的ModelForm,以便在表单中编辑该记录。但是,当我要呈现表单的HTML时,它不显示
以下是我的models.py:
在数据库中,我添加了一个名为
这是我的forms.py文件:
我的问题是,为什么这个表格中没有显示id/主键列?我无法在模板中使用以下代码进行渲染:
```html ```
这会在id为的位置呈现一个空白:
我可以从运行
在 forms.py 中,将
id
(或pk
)字段。我想把id放在一个隐藏的<input>标签中,这样当表单提交到后端时,后端就知道要编辑哪条记录。我的Web应用程序在URL中没有id。以下是我的models.py:
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=50)
phone = models.CharField(max_length=50)
在数据库中,我添加了一个名为
'Alice'
和电话号码为'212-555-5555'
的MyModel记录。它的id/主键是1
。这是我的forms.py文件:
from django import forms
from . import models
class TestForm(forms.ModelForm):
class Meta:
model = models.MyModel
fields = ['id', 'name', 'phone']
这是我的views.py文件:
from django.shortcuts import render
from . import forms, models
def test_page(request):
m = models.MyModel.objects.get(name='Alice')
prepopulatedForm = forms.TestForm(instance=m)
return render(request, 'testproject/test_template.html', {'form': prepopulatedForm})
这是我的test_template.html文件:
<h1>Test Page</h1>
{{ form }}
这将在页面上呈现表单,预填有'Alice'
和'212-555-5555'
:
<h1>Test Page</h1>
<tr><th><label for="id_name">Name:</label></th><td><input id="id_name" maxlength="50" name="name" type="text" value="Alice" required /></td></tr>
<tr><th><label for="id_phone">Phone:</label></th><td><input id="id_phone" maxlength="50" name="phone" type="text" value="212-555-5555" required /></td></tr>
我的问题是,为什么这个表格中没有显示id/主键列?我无法在模板中使用以下代码进行渲染:
```html ```
<h1>Test Page</h1>
{{ form.id }}
{{ form.name }}
{{ form.phone }}
这会在id为的位置呈现一个空白:
<h1>Test Page</h1>
<input id="id_name" maxlength="50" name="name" type="text" value="Alice" required />
<input id="id_phone" maxlength="50" name="phone" type="text" value="212-555-5555" required />
我可以从运行
python manage.py shell
命令中看到记录实际上已经存在:>>> from testproject import models
>>> m = models.MyModel.objects.get(name='Alice')
>>> m.id
1
在 forms.py 中,将
fields
设置为 ['id', 'name', 'phone']
或 ['pk', 'name', 'phone']
不会引起任何错误。但是,如果我故意添加一个不存在的字段名,例如 ['NOT_REAL_FIELD', 'name', 'phone']
,那么运行 python manage.py runserver
将会产生一个错误: File "C:\Users\Al\venvs\tas_env\lib\site-packages\django\forms\models.py", line 257, in __new__
raise FieldError(message)
django.core.exceptions.FieldError: Unknown field(s) (NOT_REAL_FIELD) specified for MyModel
我知道在ModelForm中必须使用合法的'id'
/'pk'
字段。
为什么我的Django模板不能渲染ModelForm的id或pk字段?
最终,我想在表单中包含主键作为隐藏输入,以便可以编辑数据库中的记录。请注意,我不关心ModelAdmin,因为我试图在用户可查看的模板中显示它,而不是在管理面板中。PK是只读的也不影响,只需要在模板中呈现即可。
/mymodel/<pk>/
,然后在视图中获取要编辑的对象,例如MyModel.objects.get(pk=pk)
。 - Alasdair