python - Django:基于调用 View 的 pk forms.ModelChoiceField

标签 python django django-forms django-views

我正在寻找一种通过调用 View 的pk 过滤forms.ModelChoiceField() 内容的方法。

我有一个基于类的 View :

class StorageItemMergeView(FormView):
    form_class = MergeStorageItemsForm
    #.... 

它使用MergeStorageItemsForm,当前定义为:

class MergeStorageItemsForm(forms.Form):
    storageitem1 = forms.ModelChoiceField(queryset=StorageItem.objects.get(pk=self.kwargs["pk"]))

StorageItemMergeView 连接到一个对象,因此我只想提供也已连接的对象。我尝试将 kwargs 放入几种变体中的定义中,例如

storageitem1 = forms.ModelChoiceField(queryset=StorageItem.objects.get(pk=self.kwargs["pk"]))

kwargs 似乎没有在这种情况下定义。

我还发现,可以在 modelForm 上重新定义 __init__() 来完成类似的事情

def __init__(self, user=None, **kwargs):
    super(MergeStorageItemsForm, self).__init__(**kwargs)
    #... 

这并没有达到目的。如何根据调用相应 View 的请求和/或对象来过滤表单提供的选项?

我的 urls.py 的相应部分看起来像这样

url(r'^storageitem/(?P<pk>[\w]+)/merge/$', login_required(
        StorageItemMergeView.as_view()), name='storage_item_merge'),

最佳答案

您必须在 __init__ 方法中执行此操作,如下所示:

class MergeStorageItemsForm(forms.Form):
    storageitem1 = forms.ModelChoiceField(queryset=StorageItem.objects.none())

    def __init__(self, *args, **kwargs):
        self.storage_pk = kwargs.pop('pk')
        super(MergeStorageItemsForm, self).__init__(*args, **kwargs)
        self.fileds['storageitem1'].queryset = StorageItem.objects.get(pk=self.storage_pk)

关于python - Django:基于调用 View 的 pk forms.ModelChoiceField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28615972/

相关文章:

django - 带有django-haystack的Elasticsearch自动运行更新索引

python - Django:每个外键返回一个过滤对象

python - 如何修改 ModelMultipleChoiceField 的选项

django - 根据与登录用户的关系限制表单选项

python - 我的登录表单出现 "bound method"错误

python - 在 Python 中使用 eval?

python - pygame移动方 block 超出边界

python - Django 表单选择字段在渲染后为空

python - 如何使用 django 在网络浏览器上推送通知

模型中 _set 的 Django 管理器