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

Django订单表单如何从User类预填字段?尝试initial无效

Django订单表单预填User字段失效问题解决

问题描述

需要在订单创建表单中预填当前登录用户的信息(取自User模型),尝试使用initial参数但无效果。相关代码如下:

视图代码

def order_create(request):
    cart = Cart(request)
    user = request.user
    if request.user.is_authenticated:
        if request.method == 'POST':
            form = OrderCreateForm(request.POST)
            if form.is_valid():
                order = form.save(commit=False)
                if cart.coupon:
                    order.coupon = cart.coupon
                    order.discount = cart.coupon.discount
                order.save()
                for item in cart:
                    OrderItem.objects.create(order=order,
                                            product=item['product'],
                                            price=item['price'],
                                            quantity=item['quantity'])
                cart.clear()
                order_created.delay(order.id)
                request.session['order_id'] = order.id
                return redirect(reverse('payment:process'))
        else:
            form = OrderCreateForm()
    else: 
        return redirect('login')
    return render(request,
                  'orders/order/create.html',
                  {'cart': cart, 'form': form})

表单代码

class OrderCreateForm(forms.ModelForm):

    class Meta:
        model = Order
        fields = ['first_name', 'last_name', 'email',
                  'address', 'postal_code', 'city']

模板代码

<form action="." method="post" class="order-form">
        {{ form.as_p }}
        <p><input type="submit" value="Place order"></p>
        {% csrf_token %}
</form>

解决方案

核心问题是初始化表单时未传入initial参数传递用户数据。修改视图中GET请求分支的表单初始化逻辑即可:

修改后的视图代码

def order_create(request):
    cart = Cart(request)
    user = request.user
    if request.user.is_authenticated:
        if request.method == 'POST':
            form = OrderCreateForm(request.POST)
            if form.is_valid():
                order = form.save(commit=False)
                if cart.coupon:
                    order.coupon = cart.coupon
                    order.discount = cart.coupon.discount
                order.save()
                for item in cart:
                    OrderItem.objects.create(order=order,
                                            product=item['product'],
                                            price=item['price'],
                                            quantity=item['quantity'])
                cart.clear()
                order_created.delay(order.id)
                request.session['order_id'] = order.id
                return redirect(reverse('payment:process'))
        else:
            # 传入initial参数预填用户信息
            form = OrderCreateForm(initial={
                'first_name': user.first_name,
                'last_name': user.last_name,
                'email': user.email
            })
    else: 
        return redirect('login')
    return render(request,
                  'orders/order/create.html',
                  {'cart': cart, 'form': form})

可选:设置字段只读(如需)

如果希望用户无法修改某些预填字段(比如邮箱),可以在表单中为对应字段添加只读属性:

class OrderCreateForm(forms.ModelForm):
    # 给邮箱字段添加只读属性
    email = forms.EmailField(widget=forms.TextInput(attrs={'readonly': 'readonly'}))

    class Meta:
        model = Order
        fields = ['first_name', 'last_name', 'email',
                  'address', 'postal_code', 'city']

模板无需修改,form.as_p会自动渲染预填的字段值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:43:25