【问题标题】:Django ForeignKey, hide from user select options in dropdown menuDjango ForeignKey,在下拉菜单中隐藏用户选择选项
【发布时间】:2021-12-01 10:38:36
【问题描述】:

我有带外键的标准 Django 模型。

Django 文档:

"ForeignKey 由 django.forms.ModelChoiceField 表示,它是一个 ChoiceField,其选择是一个模型 QuerySet。"

“如果模型字段设置了选项,则表单字段的小部件将设置为 Select,选项来自模型字段的选项。”

现在我有了带有选项的下拉菜单。

我不希望用户可以看到选项的下拉菜单。我想要用户输入的 CharField(textfield 或类似),但仍然 这必须是该字段的数据库中的选项之一。他必须输入一个有效的条目。

我试过了:

class TransakcijeForm(forms.ModelForm):
    model = models.Transakcije
    fields = .....
    labels = .....
    widgets ={'subscriber':forms.TextInput()}

但我收到了消息:

“选择一个有效的选项。该选项不是可用选项之一。” (输入正确,它适用于下拉菜单)

这是我在这里的第一个问题,如果我错过了表格,我很抱歉。

【问题讨论】:

  • 如果您不介意解释,为什么您不想为该表单使用选择框?如果可能的话,尝试将其设为文本框意味着用户必须知道数据库中可能存在的条目。
  • 用户识别码,16位数字。第三方通过条形码或手动输入此号码。第三方可以看到所有有效的用户 ID 代码是不好的做法。
  • 我可以发布一个应该可行的答案,但您可能需要根据项目中模型定义的具体情况对其进行调整。
  • 请做。我会为我的项目调整它。

标签: django drop-down-menu foreign-keys


【解决方案1】:

您收到该错误的原因是您的表单仍将subscriber 字段视为ModelChoiceField,因为您只是覆盖了呈现为html 的小部件。您需要更改字段的实际字段类型。你可以这样定义你的表单:

from django.core.exceptions import ValidationError

class TransakcijeForm(forms.ModelForm):
   subscriber = forms.CharField()
   class Meta:
      model = models.Transakcije
      fields = ....
      labels = ....
   
   def clean_subscriber(self):
      subscriber_id = self.cleaned_data['subscriber']
      try:
         # adjust this line to appropriately get the model object that you need
         subscriber = SubscriberModel.objects.get(id=subscriber_id)
         return subscriber
      except:
         raise ValidationError('Subscriber does not exist')

subscriber = forms.CharField() 行将更改表单以将字段视为CharField 而不是ModelChoiceField。这样做会导致表单将subscriber 字段值作为字符串返回,因此您需要根据该字段的值获取适当的模型对象。这就是 clean_subscriber(self) 函数的用途。它需要命名为clean_<field name>()。该函数将获取表单返回的字符串,尝试找到正确的模型对象并在找到对象时返回它。如果它没有找到匹配的对象,它将引发ValidationError,因此表单不会以错误的值提交。

【讨论】:

  • 我明天试试,在这里回答。谢谢!
  • 好的,如果您有任何问题或它是如何工作的,请告诉我。
  • 太棒了!有用!我将其调整为我的项目并解决了问题。这正是我所需要的!谢谢!
  • 不客气。祝你项目的其余部分好运。
猜你喜欢
  • 2018-10-14
  • 2015-09-19
  • 2014-07-09
  • 2013-06-29
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多