2017-06-12 4 views
1

ユースケースは、ログインしているユーザーのプロフィールをフォームに呼び出して編集し、データベースで更新されるというケースです。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/

答えて

1

これは誤りではありません。

GETでフォームをインスタンス化するとき、正しくUserProfileオブジェクトをinstanceパラメータとして渡します。これはフォームにそのモデルとしてそのフォームがあるため正しいです。しかし、POSTでインスタンス化すると、間違ってUserオブジェクト(request.user)が渡されます。他のブランチと同様に、プロファイルを渡す必要があります。

注:どちらの場合でも、request.user.userprofileを実行するだけで簡単にプロファイルを取得できます。

+0

POSTエリアで次のように言っています:** form = ProfileForm(request.POST、instance = request.user)**は** form = ProfileForm(request.POST、instance = request.user.userprofile) **? ** if form.is_valid()の後でこれをデバッグするので:**フォームから切り取られたデータを印刷し、正しいフォームデータを持っていました。 –

+0

はい、まさに私が言っていることです。あなたのデバッグは、フォームデータが正しいことを示しましたが、それはあなたの問題ではありません。あなたがそれを与えていなければ、データをUserProfileに保存することはできません。 –

+0

は治療を受けました。ありがとうございました。私はまだあなたが行ったことを完全に理解していないので、説明する時間があれば、それを感謝します。しかし、決して少なくはありません、ありがとうございます。 3日後、これは素晴らしいです。 –

1

無効な状況であるというフォームは、ここではまったく処理されていません。あなたのコードは次のようになります

def edit_profile(request): 
    if request.method == 'POST': 
     form = ProfileForm(request.POST, instance=request.user) 
     if form.is_valid(): 
      save_data = form.save(commit=False) 
      save_data.user = request.user 
      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) 

インデントの変更に注意してください。

+0

OKコードをコピーしましたが、エラーなしで実行されました。 (ありがとうございました)。しかし、私はフォームを提出した後もデータはデータベースに保存されませんでした。 –

関連する問題