You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何获取登录用户用户名并设置为模型字段默认值

解决Django中设置Payment模型Author字段默认值为当前登录用户的问题

我明白你遇到的困扰了——在模型里直接写{{ 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:29:42