Django 1.10では、フォームのレコードを編集するために、データベースのレコードを使用してテンプレート内にModelFormをあらかじめ準備しています。ただし、フォームのHTMLをレンダリングする場合は、id
(またはpk
)のフィールドは表示されません。 idを隠した<入力>タグに入れたいので、フォームが送信されたときにフォームが編集するレコードをバックエンドに送信するときにそのフォームが送信されます。私のWebアプリケーションはURLにidを持っていません。 、私は名前'Alice'
と電話'212-555-5555'
と1件のmymodelというレコードを追加したデータベースで私のDjangoテンプレートは、ModelFormのidフィールドまたはpkフィールドをレンダリングしないのはなぜですか?
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=50)
phone = models.CharField(max_length=50)
:
は、ここに私のmodels.pyです。 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 /プライマリキーの列がこのフォームに表示されないのはなぜですか?
<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
を実行しているから見ることができます:
<h1>Test Page</h1>
{{ form.id }}
{{ form.name }}
{{ form.phone }}
これはID <入力>があるべき空白をレンダリング:私はどちらかのテンプレートのためにこれを使用するときに私はそれをレンダリングするために取得することはできません発生しないfields
['id', 'name', 'phone']
に設定forms.pyで
>>> from testproject import models
>>> m = models.MyModel.objects.get(name='Alice')
>>> m.id
1
、:レコードが存在し、実際にあることをyエラーもありません。['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は読み取り専用です。それは単にテンプレートでレンダリングする必要があります。
なぜidフィールドを編集可能にしますか? Djangoでは、通常の方法はidをURLに含めることです。 '/ mymodel/ /'を呼び出し、ビュー内で編集するオブジェクトを取得します。 'MyModel.objects.get(pk = pk)'。 –
Alasdair
pkを隠した<入力>タグに入れたいので、フォームが送信されたときにフォームが編集するレコードを知っているバックエンドを送信します。私のURLは<ユーザーのもの>のpkを持っていませんが、むしろ "//<ユーザーのもの>"です。この2ビットの情報を使ってレコードを取得する必要がありますか? –