【问题标题】:Django ModelForm Class: Remove Foreign Key Dropdown Menu ConstraintDjango ModelForm 类:删除外键下拉菜单约束
【发布时间】:2020-12-19 14:03:25
【问题描述】:

我正在使用 Django 开发一个字典应用程序。我无法使用 Django 的 ModelForm 类成功创建表单,该类允许用户向 BOTH 现有 AND 新字典词条提交新定义。

我的models.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. 包含数据库中所有词条的下拉菜单,
  2. 用于定义的文本输入字段,
  3. 提交按钮。

因此,使用上面的代码,用户只允许向已经存在的词条添加定义。

正如我所说,我想更改它并使用此表单,以便用户能够向 BOTH 现有的词条(下拉菜单中的词条)提交定义,AND 新的(用户可以输入的)。这意味着我根本不需要表单中的下拉菜单,而只需要两个不受约束的文本输入字段和一个提交按钮。

我怎样才能做到这一点?

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

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

【问题讨论】:

    标签: python html django django-forms modelform


    【解决方案1】:

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

    看起来您正在寻找多对多关系。查看 Django Docs 并查找表单集和内联表单集。

    但如果您打算在创建定义的同时创建新的词条,那部分就有点棘手了。

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

    如果可行,下一步就是找到一个可以让您遵循相同思维方式的小部件——我想不出任何东西,抱歉:/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多