Django-使用带有信号的Django注册应用程序

Django-使用带有信号的Django注册应用程序,django,django-registration,django-signals,Django,Django Registration,Django Signals,好的,我已经建立了一个基本的Django项目,并成功地安装了Django注册应用程序- 我想扩展一个用户以包含生日、个人资料图片等信息。我创建了一个名为User\u Profile的应用程序。这是注册应用程序中的signals.py: from django.dispatch import Signal user_activated = Signal(providing_args=["user", "request"]) 在我的新应用程序中,user\u profile,如何监听此信号?我想我

好的,我已经建立了一个基本的Django项目,并成功地安装了Django注册应用程序-

我想扩展一个
用户
以包含生日、个人资料图片等信息。我创建了一个名为
User\u Profile
的应用程序。这是注册应用程序中的
signals.py

from django.dispatch import Signal
user_activated = Signal(providing_args=["user", "request"])
在我的新应用程序中,
user\u profile
,如何监听此信号?我想我应该创建一个
signals.py
文件,但是我应该在里面写什么呢?来自registration.signals import user_激活的
语句,还有什么?我创建的这个新应用程序还有一个model.py,我想在激活新帐户后自动填充一些数据


还有另一个次要问题:当我将URL链接到基于类的视图时,会触发该类的哪个方法?如果在基于类的视图中有4个方法,django如何决定使用哪一个?谢谢

好的,如果我理解你的问题,你会在你的
用户档案/models.py
文件末尾放上类似的内容:

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

def create_user_profile(sender, instance, **kwargs):
    """ 
        Function to create user profile. 
        sender is the model class that sends the signal,
        while instance is an actual instance of that class
    """

    # your own logic here, for example :

    user = instance
    profile = UserProfile()
    profile.user = user  # link the profile to the user
    profile.save()

# connect the function to the signal, for User instances)
post_save.connect(create_user_profile, sender=User)
对于第二个问题,在基于类的视图执行期间调用了许多方法。为了使用基于类的视图,您的URLconf应该如下所示:

from myapp import views
from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'list_something', views.YourListView.as_view(), name="list_something"),
)

但不应在视图中重写
as_view()
方法。根据您尝试执行的操作,您将有其他方法来覆盖。如果您能提供更多信息,我可能会帮助您。

谢谢艾略特,以下是我目前掌握的信息:

signals.py现在被删除

型号。py:

    import datime

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

try:
    from django.utils.timezone import now as datetime_now
except ImportError:
    datetime_now = datetime.datetime.now

class UserProfileManager(models.Manager):

    def create_user_profile(self, user):
        user_profile = self.create(user = user)
        return user_profile

class UserProfile(models.Model):

    YEARS = tuple(zip(range(1900, datetime_now.year)), zip(range(1900, datetime_now.year)))
    MONTHS = (
              ('January','January'),('February','February'),('March','March'),('April','April'),
              ('May','May'), ('June','June'),('July','July'),('August','August'),
              ('September','September'),('October','October'),('November','November'), ('December', 'December')

             )
    GENDERS = (('M', 'Male'), ('F', 'Female'))

    user = models.ForeignKey(User, unique=True, verbose_name=_('user'))
    birthday_year = models.CharField(max_length=1, blank = True,  null = True, choices=YEARS)
    birthday_month = models.CharField(max_length=1, blank = True,  null = True, choices=MONTHS)
    gender = models.CharField(max_length=1, blank = True,  null = True, choices=GENDERS)
    creation_time = models.DateTimeField(auto_now_add = True, auto_now = False)
    update_time = models.DateTimeField(auto_now_add = False, auto_now = True)

    class Meta:
            verbose_name = _('user profile')
            verbose_name_plural = _('user profiles')

    objects = UserProfileManager()

def create_user_profile(sender, instance, **kwargs):
    profile = UserProfile.objects.create_user_profile(user=instance)
    profile.save()

post_save.connect(create_user_profile, sender=User)

你到底想用这个信号做什么?将新用户添加到数据库时创建UserProfile对象?是。UserProfile有一些字段,如Profile Photo、Gender、birth(这不是必需的,也不会在初始化时完成),但创建时间和更新时间等字段需要初始化。是的,但是如果“YourListView”有3种方法A、B和C怎么办?正在执行哪一个?大多数情况下,如果使用基于类的泛型视图,则不必在视图中编写自定义方法。请为这一点创建一个新问题,复制粘贴您的视图代码,并在这里提供链接,我会回答您。好的,我已经编辑了我的帖子。现在my models.py的样子可以了吗?您错过了从我的代码片段中导入的
post\u save
,并且输入错误:
import datime
应该是
import datetime
。除此之外,似乎还可以。也许你应该考虑添加一个<代码>相关的名字>代码>()属性到你的代码>用户配置文件。用户< /Cord>字段,以便能够从一个用户对象中查询一个配置文件。还有一些可修改的字段,如first_name和last_name,它们会影响用户表,而性别、生日等会影响UserProfile表。所以我把这两张桌子连接起来。我必须在您的信号中将表单组合在一起(它们只有一个提交按钮),因为您没有将UserProfile实例链接到UserInstance。请尝试使用我提供的代码片段(将其复制粘贴到models.py中)