Django中如何获取登录用户用户名并设置为模型字段默认值
我明白你遇到的困扰了——在模型里直接写{{ user.username }}会被当成纯文本,去掉大括号又因为没有请求上下文找不到user对象。这是因为模型层本身不依赖请求上下文,它不知道当前是谁在访问网站,所以没法直接拿到登录用户的信息。下面给你几个实用的解决方案:
方案一:在表单层设置初始值(推荐,用户能看到默认值)
先创建对应的ModelForm,在初始化表单时传入当前登录用户,给Author字段设置初始值:
# forms.py from django import forms from .models import Payment class PaymentForm(forms.ModelForm): class Meta: model = Payment fields = ['Author', 'Product', ...] # 列出你需要的所有字段 def __init__(self, *args, **kwargs): # 从参数里取出当前用户,先pop再调用父类初始化 self.current_user = kwargs.pop('user', None) super().__init__(*args, **kwargs) # 若用户已登录,设置Author字段初始值为用户名 if self.current_user and self.current_user.is_authenticated: self.fields['Author'].initial = self.current_user.username # 不想让用户修改的话,可设置字段禁用 self.fields['Author'].widget.attrs['disabled'] = True
然后在视图里把登录用户传给表单:
# views.py from django.shortcuts import render, redirect from .forms import PaymentForm from django.contrib.auth.decorators import login_required # 用login_required确保只有登录用户能访问 @login_required def create_payment(request): if request.method == 'POST': form = PaymentForm(request.POST, user=request.user) if form.is_valid(): # 禁用字段不会提交数据,手动赋值后再保存 payment = form.save(commit=False) payment.Author = request.user.username payment.save() return redirect('payment_success') # 重定向到成功页面 else: form = PaymentForm(user=request.user) return render(request, 'create_payment.html', {'form': form})
模板里直接渲染表单即可:
<!-- create_payment.html --> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">提交</button> </form>
方案二:在视图保存时手动赋值(更简洁,适合隐藏字段场景)
如果不需要让用户看到Author字段,完全可以不在表单里处理,而是在保存对象时直接赋值:
# forms.py from django import forms from .models import Payment class PaymentForm(forms.ModelForm): class Meta: model = Payment fields = ['Product', ...] # 不包含Author字段 # views.py from django.shortcuts import render, redirect from .forms import PaymentForm from django.contrib.auth.decorators import login_required @login_required def create_payment(request): if request.method == 'POST': form = PaymentForm(request.POST) if form.is_valid(): # 先获取未保存的对象实例 payment = form.save(commit=False) # 手动设置Author为当前登录用户的用户名 payment.Author = request.user.username payment.save() return redirect('payment_success') else: form = PaymentForm() return render(request, 'create_payment.html', {'form': form})
这种方式更简洁,适合不需要用户看到该字段的场景。
额外建议:优先使用用户外键而非直接存用户名
更规范的做法是把Author字段改成用户外键,而非直接存储用户名:
# models.py from django.contrib.auth.models import User class Payment(models.Model): Author = models.ForeignKey(User, on_delete=models.CASCADE) Product = models.CharField(max_length=255) # 其他字段...
这样做的好处:
- 用户名修改时,无需手动同步Payment记录
- 可直接通过
payment.Author获取用户的邮箱、昵称等完整信息 - 符合数据库关联设计规范
如果用外键,视图里赋值会更简单:
payment.Author = request.user
注意事项
- 一定要用
@login_required装饰器保护视图,避免匿名用户访问时request.user为匿名对象导致赋值出错 - 若设置了字段禁用,记得保存时手动赋值,因为禁用字段不会被提交到后台
内容的提问来源于stack exchange,提问作者RaoufM
相关产品推荐
相关产品推荐

