django在创建新用户时使用一些数据填充数据库

时间:2013-10-17 10:49:51

标签: django django-models django-forms

如何使用一些默认/初始数据填充以下表格,每次创建新用户?我知道这个https://docs.djangoproject.com/en/dev/howto/initial-data/,但这只有在我创建模型时才有用。在这里,我想在创建新用户时插入一些默认条目。

此外,当我创建新用户时,如何将他自动添加到具有静态组ID的给定组?

models.py

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

class Category(models.Model):
    name = models.CharField(max_length=50)
    user = models.ForeignKey(User)

class Feed(models.Model):
    url = models.URLField()
    name = models.CharField(max_length=50)
    created = models.DateTimeField(auto_now_add=True)
    description = models.TextField(blank=True)
    category = models.ForeignKey(Category)
    user = models.ForeignKey(User)

views.py

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm1(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/accounts/login")
    else:
        form = UserCreationForm1()
    return render(request, "registration/signup.html", {
        'form': form,

    })

forms.py

class UserCreationForm1(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ('username', 'email')

非常感谢!

2 个答案:

答案 0 :(得分:4)

你正在寻找的是Django的信号框架。

from django.db.models.signals import post_save
from django.dispatch import receiver

from django.contrib.auth.models import User, Group
from my_app import Category, Feed

@receiver(post_save, sender=User)
def init_new_user(instance, created, raw, **kwargs):
    # raw is set when model is created from loaddata.
    if created and not raw:
        instance.groups.add(
            Group.objects.get(name='new-user-group'))

        Category.objects.create(
            name="Default", user=instance)

        Feed.objects.create(
            user = instance,
            name = "%s's Feed" % instance.first_name,
            ....
        )

参考:https://docs.djangoproject.com/en/1.5/topics/signals/

答案 1 :(得分:1)

在创建新用户时,至少有两种方法可以处理用数据填充其他模型。首先想到的是post_save signal

from django.db.models.signals import post_save
from django.dispatch import receiver

from your_app.models import Category, Feed

@receiver([post_save, post_delete], sender=Coupon)
def add_user_data(sender, **kwargs):
    user = kwargs.get('instance')

    try:
        category, category_created = Category.objects.get_or_create(user=user,
            defaults={'name': 'Some Value', 'user': user})

        try:
            feed, feed_Created = Feed.objects.get_or_create(user=user,
                category=category, defaults={'url': 'some-url',
                    'name': 'some-name', 'description': 'some-desc',
                    'category': category, 'user': user})
        except MultipleObjectsReturned:
            pass
    except MultipleObjectsReturned:
        pass

此代码将在User的实例保存时执行,但只有在该用户不存在的情况下才会创建其他记录。

另一种方法是覆盖用户表单上的save()方法。如果您在Django admin中也需要此功能,则需要取消注册内置的UserAdmin并注册您自己的UserAdmin类以利用自定义表单。