2014-01-22 24 views
0

我想在django中創建一個用戶註冊表單。
我瀏覽了很多鏈接,但我仍然感到困惑。我正在犯一些基石錯誤,請指出。 這裏是我的代碼:在django字段不存儲值的custome用戶創建

models.py

from django.db import models 
from django.db.models.signals import post_save 
from django.contrib.auth.models import User 

class UserProfile(models.Model): 

    mobile = models.CharField(max_length = 20, null=False) 
    address = models.CharField(max_length = 200) 
    user = models.OneToOneField(User, unique=True) 


def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     UserProfile.objects.create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

forms.py

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 

class CustomerRegistrationForm(UserCreationForm): 
    mobile = forms.CharField(max_length = 20) 
    address = forms.CharField(max_length = 200) 

    class Meta: 
     model = User 
     fields = ('username','email','mobile','address','password1','password2') 

view.py

from django.shortcuts import render_to_response 
from django.http import HttpResponseRedirect 
from django.template import RequestContext 
from django.core.context_processors import csrf 
from neededform.forms import CustomerRegistrationForm 

def register(request): 
    print "I am in register function" 

    if request.method == 'POST': 
     if request.method == 'POST': 
      form = CustomerRegistrationForm(request.POST) 
      if form.is_valid(): 
       f = form.save() 
      return HttpResponseRedirect('/registered/') 
    else: 
     args = {} 
     args.update(csrf(request)) 
     args['form'] = CustomerRegistrationForm() 
    return render_to_response('User_Registration.html', args ,context_instance = RequestContext(request)) 

什麼,我的想法是,當我在views.py做form.save(),Django的應該auth_user表中創建用戶,必須在UserProfile表中還插入值(即移動地址)。
但什麼發生的事情是,它是在auth_user表正確地插入數據,但在用戶配置表中只有iduser_id coloumns充滿,mobileaddress都保持爲空。
我在做什麼錯?還有什麼必須做的? 謝謝。

+0

您的表單不正確。您已將兩個字段添加到連接到'User'模型的表單。所以它會保存'User'的所有字段並忽略其他字段。在'save'過程中,手動添加一個'UserProfile'實例和表單的'cleaned_data'。 – arocks

回答

2

看看以下內容:

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     UserProfile.objects.create(user=instance) 

您創建有其user屬性設置UserProfile對象!

我不認爲使用signal是解決問題的最佳方法,因爲要將mobileaddress從表單傳遞到配置文件創建點並不容易。相反,您可以覆蓋CustomerRegistrationFormsave()方法,您將首先保存該用戶,然後創建該配置文件。類似這樣的:

class CustomerRegistrationForm(UserCreationForm): 
    # rest code ommited 
    def save(self, commit=True): 
     user = super(CustomerRegistrationForm, self).save() 
     p = UserProfile.objects.get_or_create(user=user) 
     p[0].mobile = self.cleaned_data['mobile'] 
     p[0].address = self.cleaned_data['address'] 
     p[0].save() 
     return user 
+0

感謝隊友。這是一個很大的幫助。 – Nagri

相關問題