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
相关产品推荐
相关产品推荐

