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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:35:44