问题描述
我正在使用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>
所有结果都是具有以下形式的表格:
因此,使用上述代码,只能仅向用户添加已存在的headwords定义。
正如我所说,我想对此进行更改并使用此表格,以便用户能够向 BOTH 既有headwords(下拉菜单中的), AND 新密码(用户只需输入即可)。这意味着我根本不需要表单中的下拉菜单,而只需要两个不受限制的文本输入字段和一个提交按钮。
我该如何实现?
PS:我尝试使用widgets
类中的DeFinitionForm
字典将下拉菜单覆盖为文本输入字段。但是,当我尝试提交表单时,这会导致在标题表字段上方显示一条错误消息:
选择一个有效的选择。该选择不是可用的选择之一。
解决方法
由于您有一个ForeignKey类型字段,它将自动将小部件更改为下拉菜单,因此我将这一更改保留在小部件字典中。
您似乎正在寻找多对多关系。看看Django Docs,并寻找表单集和内联表单集。
但是,如果您要在创建定义的同时创建新的Headwords,那么这一部分会有些棘手。
仅进行测试,请尝试将字段更改为常规文本输入,以CSV(或其他易于解析的方式)提交标题数据并进行解析。对于每个结果(如果不存在该标题),请在数据库中创建它,然后关联定义。如果可以,只需将其关联。
如果可行,下一步就是找到一个小部件,让您遵循相同的思维方式-对不起,我想不出什么了,:/