Django中如何将CardSet模型关联到当前登录用户ID?
解决方案
要解决创建CardSet时author_id为NULL的问题,核心是在保存实例前将当前登录用户关联到author字段,以下是具体实现步骤:
1. 确保视图仅对登录用户开放
无论使用函数视图还是类视图,都要添加登录校验,避免未登录用户创建CardSet:
- 函数视图:使用
@login_required装饰器 - 类视图:继承
LoginRequiredMixin
2. 在保存时关联当前用户
函数视图示例
假设你使用表单创建CardSet,在表单验证通过后,先临时保存实例(不提交到数据库),再赋值当前用户,最后完成保存:
from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect from .forms import CardSetForm @login_required def create_cardset(request): if request.method == 'POST': form = CardSetForm(request.POST) if form.is_valid(): # 先不提交到数据库 cardset = form.save(commit=False) # 关联当前登录用户 cardset.author = request.user # 最终保存到数据库 cardset.save() return redirect('cardset_list') # 替换为你的跳转路径 else: form = CardSetForm() return render(request, 'create_cardset.html', {'form': form})
类视图(CreateView)示例
如果使用Django的通用类视图,重写form_valid方法来赋值当前用户:
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic.edit import CreateView from .models import CardSet from .forms import CardSetForm class CardSetCreateView(LoginRequiredMixin, CreateView): model = CardSet form_class = CardSetForm success_url = '/cardsets/' # 替换为你的跳转路径 def form_valid(self, form): # 给实例的author字段赋值当前登录用户 form.instance.author = self.request.user return super().form_valid(form)
3. 可选:优化模型字段约束(推荐)
如果业务逻辑要求每个CardSet必须有创建者,建议移除author字段的blank=True和null=True,从数据库层面强制数据完整性:
User = settings.AUTH_USER_MODEL class CardSet(models.Model): name = models.TextField() description = models.TextField() date_created = models.DateTimeField(default=timezone.now) # 根据需求选择on_delete行为:CASCADE表示用户删除时同步删除CardSet,SET_NULL需保留null=True author = models.ForeignKey(User, on_delete=models.CASCADE)
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

