【发布时间】: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