如何使用一些默认/初始数据填充以下表格,每次创建新用户?我知道这个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')
非常感谢!
答案 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,
....
)
答案 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类以利用自定义表单。