ユースケースは、ログインしているユーザーのプロフィールをフォームに呼び出して編集し、データベースで更新されるというケースです。Djangoがデータベースにフォームをコミットしていません
以下のコードを使用すると、正しいプロフィールデータを表示できます。編集可能なフォームに呼び出すこともできます。このフォームではデータを編集できますが、送信時にはデータベースは更新されず、元のプロファイルが表示されます。
コンソールの印刷文を含め、すべてを試しましたので、コードのPOST部分に到達していて、有効なフォームであり、初期のsave()を行っています。
洞察が得られると思います(私はDjango 1.11を使用しています)。私はウサギを起動したくないのですが、私が試していない唯一のことは、ユーザーと登録したときにプロファイルエントリを作成したいので、ユーザーとOneToOneの関係を解除し、foriegnkeyを使用することです。
注: 私はテスト目的のために、この中にポップする場合:save_data.user =からrequest.user 私はエラーを取得する:例外値:「ユーザー」オブジェクトには属性「cleaned_data'`from django.dbインポートを持っていませんdjango.contrib.auth.modelsからモデル がdjango.db.models.signalsからユーザー をインポートModels.py post_save
をインポート
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
class UserProfile(models.Model):
user = models.OneToOneField(User)
description = models.CharField(max_length=100, default='')
city = models.CharField(max_length=100, default='')
website = models.URLField(default='')
phone = models.IntegerField(default=0)
balance = models.FloatField(default=0)
bank = models.FloatField(default=0)
image = models.ImageField(upload_to='profile_image', blank=True)
def __str__(self):
return self.user.username
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)
Forms.py
from django import forms
from django.contrib.auth.models import User
from .models import UserProfile
class ProfileForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('description', 'city', 'phone', 'balance', 'bank', 'website', 'image')
Views.py
from __future__ import unicode_literals
from django.core.urlresolvers import reverse
from django.contrib.auth import login, authenticate, update_session_auth_hash
from django.contrib.auth.forms import (
UserCreationForm,
UserChangeForm,
PasswordChangeForm
)
from django.contrib.auth.models import User
from django.shortcuts import render, redirect
from core.forms import (EditAccountForm, SignUpForm,
ProfileForm
)
from core.models import UserProfile
from django.views.generic import (TemplateView,ListView,
DetailView,CreateView,
UpdateView,DeleteView)
# Create your views here.
def edit_profile(request):
if request.method == 'POST':
form = ProfileForm(request.POST, instance=request.user)
if form.is_valid():
save_data = form.save()
save_data.user = request.user
print(save_data)
save_data.save()
return redirect(reverse('core:profile'))
else:
udata = UserProfile.objects.get(user=request.user)
form = ProfileForm(instance=udata)
args = {'form': form}
return render(request, 'core/test.html', args)
urls.py
from django.conf.urls import url
from django.contrib import admin
#from playme.core import views as core_views
from core import views as core_views
from django.contrib.auth import views as auth_views
# SET THE NAMESPACE!
app_name = 'core'
urlpatterns = [
url(r'^$', core_views.index, name='index'),
url(r'signup/$', core_views.signup, name='signup'),
url(r'^account/$', core_views.account, name='account'),
url(r'^profile/$', core_views.view_profile, name='profile'),
url(r'^login/$', auth_views.login, {'template_name': 'core/login.html'}, name='user_login'),
url(r'^logout/$', auth_views.logout, {'next_page': '/play/'}, name='logout'),
url(r'^edit_account/$', core_views.edit_account, name='edit_account'),
url(r'^edit_profile/$', core_views.edit_profile, name='edit_profile'),
url(r'^change_password/$', core_views.change_password, name='change_password'),
]
私は当たっていますURLは次のとおりです。その後に行く http://127.0.0.1:8000/play/profile/ : http://127.0.0.1:8000/play/edit_profile/
アップフォームが読み込まが、提出されたときに戻っ:いいえ、データベースのアップデートにより http://127.0.0.1:8000/play/profile/
。
POSTエリアで次のように言っています:** form = ProfileForm(request.POST、instance = request.user)**は** form = ProfileForm(request.POST、instance = request.user.userprofile) **? ** if form.is_valid()の後でこれをデバッグするので:**フォームから切り取られたデータを印刷し、正しいフォームデータを持っていました。 –
はい、まさに私が言っていることです。あなたのデバッグは、フォームデータが正しいことを示しましたが、それはあなたの問題ではありません。あなたがそれを与えていなければ、データをUserProfileに保存することはできません。 –
は治療を受けました。ありがとうございました。私はまだあなたが行ったことを完全に理解していないので、説明する時間があれば、それを感謝します。しかし、決して少なくはありません、ありがとうございます。 3日後、これは素晴らしいです。 –