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

如何在Django订单表单中自动填充已登录用户的用户名与邮箱

实现登录用户自动填充订单表单信息

要让登录状态的用户下单时,自动将用户名和邮箱填入订单表单,只需修改视图中表单初始化的逻辑,结合用户登录状态传入初始数据即可。

修改views.py代码

def order_create(request):
    cart = Cart(request)

    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(order=order, product=item['post'], price=item['price'])

            cart.clear()
            return render(request, 'store/orders/created.html', {'order': order})
    else:
        # 初始化表单时,若用户已登录则传入用户名和邮箱作为初始值
        initial_data = {}
        if request.user.is_authenticated:
            initial_data['username'] = request.user.username
            initial_data['email'] = request.user.email
        form = OrderCreateForm(initial=initial_data)

    return render(request, 'store/orders/create.html', {'cart': cart, 'form': form})

可选优化:锁定已填充字段(禁止用户修改)

如果希望登录用户无法修改自动填充的用户名和邮箱,可以给表单字段添加disabled属性:

1. 修改forms.py

class OrderCreateForm(forms.ModelForm):
    username = forms.CharField(label='Имя пользователя', widget=forms.TextInput(attrs={'class': 'form-control'}))
    email = forms.EmailField(label='E-mail', widget=forms.EmailInput(attrs={'class': 'form-control'}))
    vk_or_telegram = forms.CharField(label='Введите ссылку на vk или telegram для связи с админом',
                                     widget=forms.TextInput(attrs={'class': 'form-control'}))

    captcha = ReCaptchaField()

    class Meta:
        model = Order
        fields = ('username', 'email', 'vk_or_telegram')

    def __init__(self, *args, **kwargs):
        # 从参数中取出用户对象
        user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        # 若用户已登录,禁用用户名和邮箱输入框
        if user and user.is_authenticated:
            self.fields['username'].widget.attrs['disabled'] = True
            self.fields['email'].widget.attrs['disabled'] = True

2. 修改views.py中的表单实例化逻辑

# 在GET分支中修改表单实例化代码
form = OrderCreateForm(initial=initial_data, user=request.user)

3. 处理表单提交时的字段赋值

由于disabled字段不会被提交到后台,需要在保存订单时手动赋值:

if form.is_valid():
    # 先不保存到数据库
    order = form.save(commit=False)
    # 若用户已登录,手动设置用户名和邮箱
    if request.user.is_authenticated:
        order.username = request.user.username
        order.email = request.user.email
    # 保存订单
    order.save()

内容的提问来源于stack exchange,提问作者Zesshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:35:42