3

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

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

模型.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)

视图.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,

    })

表格.py

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

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

非常感谢!

4

2 回答 2

5

您正在寻找的是 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/

于 2013-10-17T12:49:50.427 回答
1

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

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 类以利用自定义表单。

于 2013-10-17T12:48:31.080 回答