【发布时间】:2018-05-25 14:58:57
【问题描述】:
我有一个库存管理应用,它将服务于多个位置(在我的应用中称为上下文)。当用户登录时,他们当前的上下文作为值存储在 request.sessions 中。
我希望用户只能浏览和检索他们自己位置的记录。
我一直在尝试通过过滤表单定义中调用的查询集来填充选择下拉列表,即
referenced_catalog = forms.ModelChoiceField(
queryset=Inventory_unit_catalog.objects.all().filter(parent_business_unit_context_id=user_context_id),
我已经尝试从各种 SO 帖子中实现几种不同(但相似)的方法,其中涉及为表单定义一个 init 块,例如:
class InventoryStockAddForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user_context_id = kwargs.pop('user_context_id', None)
super(InventoryStockAddForm, self).__init__(*args, **kwargs)
name = forms.CharField(max_length=96,widget=forms.TextInput(),required=True)
referenced_catalog = forms.ModelChoiceField(
queryset = Inventory_unit_catalog.objects.all().filter(parent_business_unit_context_id=self.user_context_id),
label = u"",
widget = ModelSelect2Widget(
model=Inventory_unit_catalog,
search_fields=['name__icontains'],
attrs={'data-placeholder': 'Select catalog...', 'data-width': '35em'},
required=False))
class Meta():
model = Inventory_unit_stock
fields = ('name',)
(不同的 SO 答案有一种或另一种。)
然后在views.py中:
user_context_id = request.session.get('user_context_id')
...
add_form = InventoryStockAddForm(user_context_id=user_context_id)
我什至尝试使用https://djangobook.com/using-sessions-views-2/ 的 SessionStore:
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
s = SessionStore()
user_context_id = s['user_context_id']
但它总是在forms.py更新时失败,因为Django验证代码并且在验证时找不到键值。
任何建议将不胜感激,谢谢!
【问题讨论】:
-
@Alasdair 已根据您的要求更新。
-
请检查缩进
-
@Alasdair,已更正,感谢您指出
标签: django