2012-07-15 67 views
18

Tôi đang theo tài liệu Django here để đạt được mục tiêu đơn giản: Tạo hồ sơ người dùng ngay khi người dùng mới được tạo.Django - Tạo hồ sơ người dùng khi tạo người dùng

Tôi có một ứng dụng 'tài khoản' và accounts.models của tôi trông như thế này:

# -*- coding: utf-8 -*- 
from django.db import models 
from django.db.models.signals import post_save 
from django.contrib.auth.models import User 
from main.models import Store 

class UserProfile(models.Model): 

    GENRE_CHOICES = (
     ('m', 'Masculino'), 
     ('f', 'Feminino'), 
    ) 
    MARITAL_STATUS_CHOICES = (
     ('s', 'Solteiro'), 
     ('c', 'Casado'), 
     ('d', 'Divorciado'), 
     ('v', 'Viúvo'), 
    ) 

    user = models.ForeignKey(User, unique=True) 
    birth_date = models.DateField() 
    genre = models.CharField(max_length=1, choices=GENRE_CHOICES) 
    address = models.CharField(max_length=150) 
    postal_code_4 = models.PositiveIntegerField() 
    postal_code_3 = models.PositiveIntegerField() 
    locatity = models.CharField(max_length=30) 
    marital_status = models.CharField(max_length=1, choices=MARITAL_STATUS_CHOICES) 
    child_amount = models.PositiveSmallIntegerField() 
    is_merchant = models.BooleanField(default=False) 
    store = models.ForeignKey(Store, null=True) 

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

post_save.connect(create_user_profile, sender=User) 

Tất cả mọi thứ có vẻ tốt đẹp đối với tôi nhưng khi cố gắng thêm người dùng mới (sử dụng django admin), thay vì có một mới được tạo ra sử dụng và lý lịch thành viên, tôi nhận được lỗi sau: InternalError tại/admin/auth/người dùng/thêm/ giao dịch vãng lai được hủy bỏ, các lệnh bị bỏ qua cho đến khi kết thúc khối giao dịch

Dưới đây là phần lỗi traceback :

/djangoProjects/lwboanova/lwboanova/apps/accounts/models.py in create_user_profile 

34: UserProfile.objects.create(user=instance) 

Có vẻ như lỗi toàn vẹn nhưng tôi không hiểu lý do.

Sẽ tuyệt vời nếu bạn có thể giúp tôi về điều này.

+3

Bạn đã cài đặt thanh công cụ django chưa? Nếu vậy hãy thử vô hiệu hóa nó để bạn nhận được thông tin lỗi tốt hơn. –

Trả lời

14

Chỉ cần tìm ra.

Tôi quên thêm null=True vào các trường còn lại UserProfile mô hình.

Vì vậy, các lĩnh vực accounts.models.UserProfile bây giờ trông giống như:

user = models.ForeignKey(User, unique=True) 
birth_date = models.DateField(null=True) 
genre = models.CharField(max_length=1, choices=GENRE_CHOICES, null=True) 
address = models.CharField(max_length=150, null=True) 
postal_code_4 = models.PositiveIntegerField(null=True) 
postal_code_3 = models.PositiveIntegerField(null=True) 
locatity = models.CharField(max_length=30, null=True) 
marital_status = models.CharField(max_length=1, choices=MARITAL_STATUS_CHOICES, null=True) 
child_amount = models.PositiveSmallIntegerField(null=True) 
is_merchant = models.BooleanField(default=False) 
store = models.ForeignKey(Store, null=True) 

... và tất cả mọi thứ đang làm việc như mong đợi!

Chúc mừng bạn đã cố gắng để giúp Ashray ^^

+0

, bạn có thể vui lòng kiểm tra và hướng dẫn tôi, SO câu hỏi http://stackoverflow.com/questions/17806683/create-row-of-date-while-creating-superuser – user2086641

14

Bạn không nên sử dụng:

user = models.ForeignKey(User, unique=True) 

Thay vì sử dụng này:

from django.conf import settings 
.. 
user = models.OneToOneField(settings.AUTH_USER_MODEL) 
+0

Bạn nói đúng về OneToOneField, nhưng liên quan đến Mô hình người dùng là tốt. Tức là, nếu bạn mở rộng bản dựng trong Người dùng bằng các trường bổ sung. Chỉ sử dụng cài đặt 'AUTH_USER_MODEL' nếu bạn muốn thay thế bản dựng trong Mô hình người dùng bằng chính bạn. – allcaps

+3

@allcaps Câu cuối cùng là gây hiểu nhầm. 'settings.AUTH_USER_MODEL' là một cách để bảo vệ đoạn mã này khỏi lỗi hồi quy nếu mã cứng' Người dùng' không còn là mô hình trong tương lai. – JSmyth

0
def create_profile(sender,**kwargs): 
    if kwargs['created']: 
     user_profile=UserProfile.objects.create(user=kwargs['instance']) 


post_save.connect(create_profile,sender=User) 

Tôi nghĩ rằng đây sẽ giúp bạn.

Các vấn đề liên quan