gpt4 book ai didi

django - 为什么我的Django模板不呈现ModelForm的id或pk字段?

转载 作者:行者123 更新时间:2023-12-01 15:28:19 24 4
gpt4 key购买 nike

在Django 1.10中,我正在使用数据库中的记录预填充模板中的ModelForm,以便在表单中编辑该记录。但是,当我要呈现表单的HTML时,它不显示id(或pk)字段。我想将ID放在隐藏的标记中,以便在提交表单时后端知道提交表单时要编辑的记录。我的网络应用程序的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)

在数据库中,我添加了一个MyModel记录,名称为 'Alice'和phone '212-555-5555'。 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 / primary key列不以这种形式出现?我将其用于模板时也无法渲染:
<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

所以我知道 'id' / 'pk'必须是放入ModelForm的合法字段。

为什么我的Django模板不呈现ModelForm的id或pk字段?

最终,我想将主键作为隐藏输入包含在表单中,以便可以编辑数据库中的记录。还要注意,我不在乎ModelAdmin,因为我试图将其显示在用户可见的模板中,而不是在管理面板中。 pk是只读的很好。它只需要在模板中呈现。

最佳答案

如何使用{{ form.initial.id }}访问ID?

从我在查看ModelForm元类时可以看出,form.initial的填充与表单属性(例如form.nameform.phone)的创建有所不同。所以基本上它在django元类magic的杂草中...

更具体一点。似乎在创建表单时,会调用model_to_dict将数据从传入的模型实例中拉出。但是直到fields_for_model调用后,表单实例才具有可作为类属性访问的模型字段。我猜想id被排除在fields_for_model中考虑的字段之外。看起来您引用的不可编辑字段异常也在此处引发。

关于django - 为什么我的Django模板不呈现ModelForm的id或pk字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43067707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com