ここの Django 初心者は、フォームを機能させるのに苦労しています。はい、私はチュートリアルに取り組み、Web をたくさん閲覧しました。私が持っているのは、ここと他のサイトで見つけたものを組み合わせたものです。Python 2.7 と Django 1.5 を使用しています。(公式ドキュメントは広範囲に渡っていますが、ほとんどのことを既に知っていると想定する傾向があります。初心者向けのリファレンスとしても、上級者向けのチュートリアルとしても適切ではありません)
「拡張」ユーザー詳細のフォームを作成しようとしています-たとえば。会社名、住所などですが、フォームデータはデータベースに保存されていません。
最初は、標準モデルを拡張したモデルを作成しようとしましたUser
が、それをあきらめました。変更が多すぎて、この段階では私をはるかに超えていました。代わりに、UserProfile
次の新しいモデルを作成しました。
class UserProfile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=True)
company = models.CharField(max_length=50, blank=True)
address1 = models.CharField(max_length=50, blank=True)
address2 = models.CharField(max_length=50, blank=True)
city = models.CharField(max_length=20, blank=True)
region = models.CharField(max_length=20, blank=True)
postcode = models.CharField(max_length=10, blank=True)
country = models.CharField(max_length=20, blank=True)
phone = models.CharField(max_length=30, blank = True)
User モデルにForeignKey
(上記のように) または OneToOne を使用してリンクする必要があるかどうかについて、オンラインでさまざまな参照を見てきました。
ModelForm を使用しようとしています (シンプルなフォームであるべきものをシンプルに保ちます)。これが私のforms.pyです
from django.forms import ModelForm
from .models import UserProfile
class UserDetailsForm(ModelForm):
class Meta:
model = UserProfile
fields = ['company','address1','address2','city','region', 'postcode','country','phone']
これが私の見解です:
def UserDetailsView(request):
#f = 0
if request.method == 'POST':
f = UserDetailsForm(request.POST, instance = request.user)
if f.is_valid():
f.save()
else:
f = UserDetailsForm(request.POST , instance = request.user)
print "UserDetails objects: ", (UserProfile.objects.all())
return render_to_response('plagweb/console/profile.html',
{ 'form': f},
context_instance=RequestContext(request))
(はい、UserProfile と UserDetail に矛盾があります。これは私のすべてのハッキングの結果であり、機能するようになったら修正されます)
診断はf.is_valid()
、True を返すことを示しています。同様に、診断UserProfile.objects.all()
は空として表示されます。save() の後の上記のビューと、Django コンソールでもこれを試しました。
ここに私のテンプレートがあります:
<form method="POST" action="">
<table>{{ form }}</table>
<input type="submit" value="Update" />
{% csrf_token %}
</form>
現時点での主な問題は、フォーム データがデータベースに保存されていないことです。まだ読み取られているかどうかはわかりません(データベースにデータがあれば...)
1つの考えは、User
関係が問題を引き起こしている可能性があるということですか?
ダニエル・ローズマンの有用なコメント/ヘルプに続く補遺:
現在、フォームは正しく保存されています (診断とコマンド ライン チェックで確認されています。ただし、フォームに戻ると、既存のデータが表示されていません。データ フィールドが空のフォームが表示されます。 m インスタンス データを正しく渡します。
変更が必要な ModelForm 設定はありますか?
変更されたビューは次のとおりです。
def UserDetailsView(request):
#print "request co:", request.user.profile.company
f = UserDetailsForm(request.POST, instance = request.user.profile )
if request.method == 'POST':
if f.is_valid():
profile = f.save(commit=False)
profile.user = request.user
profile.save()
return render_to_response('plagweb/console/profile.html',
{ 'form': f},
context_instance=RequestContext(request))
診断は、request.user.profile
正しく設定されていることを示しています (具体的には会社フィールド)。ただし、フォームは空のフィールドで表示されます。HTML ソースにもデータ値は表示されません。追加のチェックとして、いくつかのテンプレート診断も試しました。
<table border='1'>
{% for field in form%}
<tr>
<td>{{field.label}}</td>
<td>{{field.value}}</td>
</tr>
{% endfor%}
</table>
これにより、フィールド ラベルが正しく一覧表示されますが、値はすべて として報告されNone
ます。
完全を期すために、UserProfile の user フィールドは として定義されuser = models.OneToOneField(settings.AUTH_USER_MODEL)
、User.profile ラムダ式は変更されていません。