2017-06-12 141 views
1

使用情况是一个登录使用,可以调出他们的个人资料到表单中,编辑它使它在数据库中更新。Django的不提交表单数据库

与下面的正确资料数据的代码能够被观看。它也可以被调用成可编辑的形式。表单允许编辑数据,但是在提交数据时,数据库不会更新并显示原始配置文件。

我用尽了一切办法,包括控制台打印报表,所以我知道它是如何到达代码的POST部分,是一个有效的形式,做最初的保存()。

任何见解将不胜感激(我使用Django 1.11)。我不想开始运行一只兔子,但我唯一没有尝试过的方法是断开与用户的OneToOne关系并使用foriegnkey,因为我想在用户注册时创建配置文件条目。

注: 当我突然出现在这个测试目的:save_data.user = request.user 我得到的错误:异常值:“用户”对象有没有属性“cleaned_data'`from django.db进口车型 从django.contrib.auth.models导入用户 从django.db.models.signals导入post_save

Models.py

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'), 
] 

我打的网址是: 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上实例化时,您不正确地传递用户对象 - 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

好的,我复制了你的代码,它运行没有错误。 (谢谢)。但在提交表单后,数据没有保存到数据库中。 –