【问题标题】:Passing Parameter for Queryset to Django Form将查询集的参数传递给 Django 表单
【发布时间】:2018-12-31 15:27:21
【问题描述】:

我正在为表单使用 django (2.1) ModelMultipleChoice 字段。我正在尝试根据 URL 中的 slug 修改查询集。我很确定我错过了一些愚蠢的东西。

形式:

class SubdomainForm(forms.Form):
    # TODO Get the value slug from init
    slug = "camp" # Works well if value of slug set here.
    q = Feature2Subdomain.objects.all().select_related().filter(subdomain__slug=slug)
    choices = forms.ModelMultipleChoiceField(
        queryset = q,
        widget = forms.CheckboxSelectMultiple,
    )

def __init__(self, *args, **kwargs):
    slug = kwargs.pop('slug', None) # Correctly obtains slug from url
    super(SubdomainForm, self).__init__(*args, **kwargs)

观点:

class SubdomainDetailView(FormView):
    template_name = "guide/subdomain-detail.html"
    form_class = SubdomainForm

    def get_form_kwargs(self, form_class=SubdomainForm):
        s = dict(slug = self.kwargs['slug'])
        return s

URLS.py

urlpatterns = [
    path('subdomain/<slug:slug>/',
         SubdomainDetailView.as_view(),
         name="subdomain-detail"
    ),
    .....

显然,这个想法是来自 URL 的 slug 用于修改查询集。 (在示例中,slug 的值是“camp”

我可以在表单的init方法中获取slug的值,并且可以调用super()来实例化表单。但是,我不知道如何访问表单“选择”行中的值。如果我硬编码 slug="camp" 的值,我可以让整个事情正常工作。

我已经为此工作了几天,并用尽了 SO 和 google 中的所有示例。

我尝试将“选择”分配移动到 init 方法中并使用

 self.choices = forms.ModelMultipleChoiceField(
        queryset = Feature2Subdomain.objects.all().select_related().filter(subdomain__slug=slug)
        widget = forms.CheckboxSelectMultiple,
    )

但这并没有显示正确的响应(它返回一个空表单)

还尝试像这样在 init 方法中分配查询集。

class SubdomainForm(forms.Form):
    choices = forms.ModelMultipleChoiceField(
        widget = forms.CheckboxSelectMultiple,
    )

    def __init__(self, *args, **kwargs):
        slug = kwargs.pop('slug', None) # Correctly obtains slug from url
        self.queryset = Feature2Subdomain.objects.all().select_related().filter(subdomain__slug=slug)

        super(SubdomainForm, self).__init__(*args, **kwargs) 

然后我得到错误: 类型错误:init() 缺少 1 个必需的位置参数:'queryset'

对下一步该去哪里感到迷茫。

任何帮助将不胜感激。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    对于您的最后一次尝试,您可以像这样修改代码:

    class SubdomainForm(forms.Form):
        choices = forms.ModelMultipleChoiceField(
            widget = forms.CheckboxSelectMultiple,
            queryset = Feature2Subdomain.objects.all()
        )
    
        def __init__(self, *args, **kwargs):
            slug = kwargs.pop('slug', None) # Correctly obtains slug from url
            super().__init__(*args, **kwargs) 
            self.fields['choices'].queryset = Feature2Subdomain.objects.filter(subdomain__slug=slug)  # you don't need select related
    

    【讨论】:

    • 知道了。我需要在表单定义中声明一个查询集,但这被 init 方法覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2013-10-22
    相关资源
    最近更新 更多