Django ModelForm类:删除外键下拉菜单约束

问题描述

我正在使用Django开发字典应用程序。我在使用Django的ModelForm类成功创建表单时遇到麻烦,该类允许用户 BOTH 和现有的 AND 新字典headwords提交新定义。

我的模型。py:

class Headword(models.Model):
    headword = models.CharField(max_length=64,unique=True)

class DeFinition(models.Model):
    deFinition = models.CharField(max_length=64)
    headword = models.ForeignKey(Headword,related_name="deFinitions_headword")

我的forms.py:

class DeFinitionForm(forms.ModelForm):
    class Meta:
        model = DeFinition
        fields = ["headword","deFinition"]

我的HTML表单:

<form action="{% url 'dictionary:define' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Define</button>
</form>

所有结果都是具有以下形式的表格:

  1. 一个下拉菜单,其中包含数据库中已经存在的所有headwords,
  2. 定义的文本输入字段,
  3. 一个提交按钮。

因此,使用上述代码,只能用户添加已存在的headwords定义。

正如我所说,我想对此进行更改并使用此表格,以便用户能够向 BOTH 既有headwords(下拉菜单中的), AND 新密码用户只需输入即可)。这意味着我根本不需要表单中的下拉菜单,而只需要两个不受限制的文本输入字段和一个提交按钮。

我该如何实现?

PS:我尝试使用widgets类中的DeFinitionForm字典将下拉菜单覆盖为文本输入字段。但是,当我尝试提交表单时,这会导致在标题表字段上方显示一条错误消息:

选择一个有效的选择。该选择不是可用的选择之一。

解决方法

由于您有一个ForeignKey类型字段,它将自动将小部件更改为下拉菜单,因此我将这一更改保留在小部件字典中。

您似乎正在寻找多对多关系。看看Django Docs,并寻找表单集和内联表单集。

但是,如果您要在创建定义的同时创建新的Headwords,那么这一部分会有些棘手。

仅进行测试,请尝试将字段更改为常规文本输入,以CSV(或其他易于解析的方式)提交标题数据并进行解析。对于每个结果(如果不存在该标题),请在数据库中创建它,然后关联定义。如果可以,只需将其关联。

如果可行,下一步就是找到一个小部件,让您遵循相同的思维方式-对不起,我想不出什么了,:/