Django表单调用request.session值及OutwardForm商品列表加载失败问题
Django表单调用request.session及商品列表加载问题修复
一、Django表单中调用request.session的两种方式
方式1:视图层传递session中的值到表单
先在视图里从request.session取出目标值,再通过表单初始化的kwargs传递进去,这是解耦性最好的常用方式:
- 视图取值:
warehouse_id = request.session.get('warehouse_id') - 创建表单时传入:
form = OutwardForm(request.POST or None, warehouse_id=warehouse_id) - 表单
__init__方法接收并使用:self.warehouse_id = kwargs.pop('warehouse_id', None)
方式2:直接传递request对象到表单
如果需要在表单中使用多个session值或request其他属性,可直接把request传到表单:
- 视图创建表单:
form = OutwardForm(request.POST or None, request=request) - 表单
__init__方法接收:self.request = kwargs.pop('request', None) - 使用session值:
self.request.session['warehouse_id']
二、OutwardForm加载商品列表失败的修复方案
1. 修复forms.py的核心错误
你当前代码中forms.py的问题是:在表单__init__里直接使用未定义的request变量,且已经通过kwargs传入了warehouse_id,直接用这个值即可:
修改后的forms.py:
class OutwardForm(forms.Form): item = forms.ModelChoiceField(queryset=StoreItems.objects.none()) quantity = forms.IntegerField() name = forms.CharField() emp_id = forms.IntegerField() def __init__(self, *args, **kwargs): self.warehouse_id = kwargs.pop('warehouse_id', None) super().__init__(*args, **kwargs) # 使用已传入的warehouse_id,无需访问未定义的request if self.warehouse_id: self.fields['item'].queryset = StoreItems.objects.filter(warehouse_id=self.warehouse_id) def clean(self): cleaned_data = super().clean() # 保留原有的clean逻辑 return cleaned_data
2. 修复views.py的两处问题
你的views.py存在两个导致表单加载失败的逻辑漏洞:
- GET请求时创建表单未传入
warehouse_id - POST请求成功后重置表单时也未传入
warehouse_id
修改后的views.py:
def outward(request): warehouse_id = request.session.get('warehouse_id') message = "" # 统一创建带warehouse_id的表单,覆盖GET/POST场景 form = OutwardForm(request.POST or None, warehouse_id=warehouse_id) if request.method == 'POST': if form.is_valid(): item = form.cleaned_data['item'] quantity = form.cleaned_data['quantity'] name = form.cleaned_data['name'] emp_id = form.cleaned_data['emp_id'] opr_name = request.user.username if item.quantity >= quantity: item.quantity -= quantity item.save() record_transaction(item, quantity, name, emp_id, 'outward', opr_name, warehouse_id) message = "Success" # 重置表单时传入warehouse_id,保证商品列表正常加载 form = OutwardForm(warehouse_id=warehouse_id) else: message = "Quantity must not be less than available quantity" context = { 'form': form, 'message': message } return render(request,'outward.html',context)
3. 补充outward.html的表单标签
你的HTML代码缺少<form>标签,会导致表单无法提交,补充完整:
<h1>Outward Item</h1> <form method="POST"> {% csrf_token %} <div> Item Name : {{form.item}} </div> <div> Quantity : {{form.quantity}} </div> <div> Name of User : {{form.name}} </div> <div> Employee ID : {{form.emp_id}} </div> <button type="submit">Submit</button> </form>
内容的提问来源于stack exchange,提问作者devpro asad
相关产品推荐
相关产品推荐

