Django 2.2设置没有id/pk的ModelChoiceField初始值
我有一个基于GET的搜索,通过查询字符串传递一些搜索词和分页信息。我可以毫无问题地从查询字符串中获取项目,但是通过SearchForm将它们传递回模板以保留搜索被证明是困难的Django 2.2设置没有id/pk的ModelChoiceField初始值,django,Django,我有一个基于GET的搜索,通过查询字符串传递一些搜索词和分页信息。我可以毫无问题地从查询字符串中获取项目,但是通过SearchForm将它们传递回模板以保留搜索被证明是困难的 items/?search=foo&category=bar&page=1&pageSize=20 forms.py *为简洁起见简化 在视图中,我可以从查询字符串中检索所有值或它们的默认值,甚至可以为搜索字段设置值,但ModelChoiceField是我正在努力解决的问题。我可以设置初始值,但不能基于选择文本 视图.py
items/?search=foo&category=bar&page=1&pageSize=20
forms.py
*为简洁起见简化
在视图中,我可以从查询字符串中检索所有值或它们的默认值,甚至可以为搜索字段设置值,但ModelChoiceField是我正在努力解决的问题。我可以设置初始值,但不能基于选择文本
视图.py
我尝试了各种方法试图从form.category字段检索值/id,但都没有成功。我不想再次调用数据库来获取类别,然后从查询中提取id,但这似乎是唯一的事情
我不知道是否应该将页面和页面大小字段添加到SearchForm中,然后以某种方式抑制它们的显示,但我的尝试没有成功,即:
class SearchForm(forms.Form):
search = forms.CharField()
category = forms.ModelChoiceField(queryset=Items.objects.all())
page = forms.IntegerField()
pageSize = forms.IntegerField()
class Meta:
fields = ['search', 'category']
在本例中,页面和页面大小仍然作为字段显示给用户
我曾经尝试过使用\uuuu init\uuu
构造函数设置初始值的各种解决方案,但也没有成功
如果能朝正确的方向轻推,尤其是在不利用ListView CBV的情况下,我会非常感激。我找到了一种方法,可以不使用该属性返回数据库。这与其名称相矛盾,设置了
标记的value属性
category = forms.ModelChoiceField(queryset=Category.objects.all(), *)
结果显示在html中:
<select name="category" class="form-control w100 " id="id_category">
<option value="" selected>Category</option>
<option value="1">Category 1</option>
<option value="2">Category 2</option>
<option value="3">Category 3</option>
</select>
它试图将值=1
与类别进行比较,结果为空
解决方案:
将添加到\u field\u name=
属性添加到搜索表单
字段声明:
category = forms.ModelChoiceField(queryset=Category.objects.all(), to_field_name='name', *)
结果显示在html中:
<select name="category" class="form-control w100 " id="id_category">
<option value="" selected>Category</option>
<option value="Category 1">Category 1</option>
<option value="Category 2">Category 2</option>
<option value="Category 3">Category 3</option>
</select>
类别
第一类
第2类
第3类
制作表单字段['category'].initial=category
将value=“category 1”
与category
<select name="category" class="form-control w100 " id="id_category">
<option value="" selected>Category</option>
<option value="1">Category 1</option>
<option value="2">Category 2</option>
<option value="3">Category 3</option>
</select>
form.fields['category'].initial = category #where category='Category 1'
category = forms.ModelChoiceField(queryset=Category.objects.all(), to_field_name='name', *)
<select name="category" class="form-control w100 " id="id_category">
<option value="" selected>Category</option>
<option value="Category 1">Category 1</option>
<option value="Category 2">Category 2</option>
<option value="Category 3">Category 3</option>
</select>