Django中Blogger模型未关联内置表单创建的User数据问题
问题:Django内置登录表单创建的User未关联到Blogger模型
我现在在用Django的内置登录表单,想让Blogger模型关联所有通过这个表单创建的User,但发现这些User并没有显示在Blogger模型里。下面是我的相关代码:
模型代码
class Blogger(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE,null=True) follows = models.ManyToManyField('self', related_name='following', symmetrical=False) def __str__(self): return self.user.username
注册视图代码
def signup(request): if request.method == 'POST': form = SignUpForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data.get('username') raw_password = form.cleaned_data.get('password1') user = authenticate(username=username, password=raw_password) login(request, user) return redirect('/blog') else: form = SignUpForm() return render(request, 'winterblog/signup.html', {'form': form})
解决方案
嗨,这个问题其实很好解决:你现在只创建了User对象,但没有为每个新注册的User自动创建对应的Blogger实例,所以两者自然没有关联,也就看不到User在Blogger模型里啦。
我给你两个关键的处理步骤:
1. 修改注册视图,自动关联User和Blogger
你只需要在保存User之后,立刻为它创建对应的Blogger对象就行,而且还能简化登录逻辑——form.save()本身就会返回刚创建的User实例,不用再调用authenticate啦。修改后的代码如下:
def signup(request): if request.method == 'POST': form = SignUpForm(request.POST) if form.is_valid(): # 保存User并直接获取实例 user = form.save() # 为这个User创建对应的Blogger关联 Blogger.objects.create(user=user) # 直接用刚创建的user登录 login(request, user) return redirect('/blog') else: form = SignUpForm() return render(request, 'winterblog/signup.html', {'form': form})
2. 补建已有User的Blogger关联(可选)
如果之前已经注册了一些User,但还没创建对应的Blogger,你可以通过Django Shell批量补建,避免手动逐个添加:
打开终端进入项目目录,运行python manage.py shell,然后执行以下代码:
from django.contrib.auth.models import User from your_app.models import Blogger # 替换成你的实际app名称 # 遍历所有User,为没有Blogger的创建关联 for user in User.objects.all(): Blogger.objects.get_or_create(user=user)
get_or_create方法会自动判断:如果这个User已经有对应的Blogger就跳过,没有的话就创建,不会造成重复数据。
这样处理之后,新注册的User会自动关联Blogger,老的User也能补上关联啦~
内容的提问来源于stack exchange,提问作者sam007
相关产品推荐
相关产品推荐

