Django 2.2设置没有id/pk的ModelChoiceField初始值

Django 2.2设置没有id/pk的ModelChoiceField初始值,django,Django,我有一个基于GET的搜索,通过查询字符串传递一些搜索词和分页信息。我可以毫无问题地从查询字符串中获取项目,但是通过SearchForm将它们传递回模板以保留搜索被证明是困难的 items/?search=foo&category=bar&page=1&pageSize=20 forms.py *为简洁起见简化 在视图中,我可以从查询字符串中检索所有值或它们的默认值,甚至可以为搜索字段设置值,但ModelChoiceField是我正在努力解决的问题。我可以设置初始值,但不能基于选择文本 视图.py

我有一个基于GET的搜索,通过查询字符串传递一些搜索词和分页信息。我可以毫无问题地从查询字符串中获取项目,但是通过SearchForm将它们传递回模板以保留搜索被证明是困难的

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>