【问题标题】:ModelChoiceField does not show ForeignKey choicesModelChoiceField 不显示 ForeignKey 选择
【发布时间】:2020-11-26 10:13:45
【问题描述】:

我想在 Django 表单中显示一个下拉菜单,其中下拉项目是在另一个应用程序的另一个模型中指定的。这就是我的意思:

title/models.py

TITLE_CHOICES = (
    ('MR', 'Mr'),
    ('MS', 'Ms'),
    ('MISS', 'Miss'),
    ('MRS', 'Mrs'),
    ('MX', 'Mx'),
)

class Title(models.Model):
    title_name = models.CharField(max_length=10, choices=TITLE_CHOICES)

    def __str__(self):
        return self.title_name

user/models.py

class User(models.Model):
    ...
    user_title = models.ForeignKey('title.Title', on_delete=models.CASCADE)
    ...

user/forms.py

class SignupForm(forms.ModelForm):
        user_title = forms.ModelChoiceField(queryset=Title.objects.all())

        class Meta:
            model = User
            fields = '__all__'

        def signup(self, request, user): #this is to override the **allauth** signup form
            user.user_title = self.cleaned_data['title_name']
            ...
            ...

            user.save()

使用上面的代码,下拉字段正确呈现;但是,它是空的。

非常感谢任何想法或建议。

谢谢。

【问题讨论】:

  • 为什么不在 User 类中使用 user_title=models.CharField(max_length=10, choices=TITLE_CHOICES) 呢?
  • @riNg,我想将标题保留在单独的应用程序中,以便可以轻松地在我的 Django 项目中的其他应用程序中使用。
  • 如果是这样,您必须在创建用户之前创建标题。它是空的,因为您的数据库中没有任何标题。
  • 如果您不需要添加/更改/删除标题,那么您不需要标题模型。否则,如果您有很多默认标题并想自动创建它们,也许这会对您有所帮助stackoverflow.com/questions/46761148/…
  • 您的数据库中是否有任何 Title 实例?

标签: python django django-models django-forms


【解决方案1】:

请将您的 user_title 字段更改为此并试试这个。

user_title = forms.ModelChoiceField(queryset=Title.objects.all(), widget=forms.Select(attrs={'class': 'form-control'}))

【讨论】:

    【解决方案2】:

    如果您要在您声明的 TITLE_CHOICES 中创建所有选项,我只需制作一个夹具并将其加载到数据库中。

    我会稍微改变一下模型:title.models

    def Title(models.Model):
        title_name = models.CharField(max_length=10)
        title = models.CharField(max_length=10)
    
        def __str__(self):
            return self.title_name
    

    然后制作一个json文件:title/fixtures/titles.json

    [
        {
            "model": "title.Title",
            "pk": 1,
            "fields": {
              "title_name": "MR",
              "title" : "Mr"
            }
        },
        {
            "model": "title.Title",
            "pk": 2,
            "fields": {
              "title_name": "MS",
              "title" : "Ms"
            }
        },
        ...
    ]
    

    然后通过python manage.py loaddata titles命令将此json文件加载到数据库中。这将自动将 json 文件中的所有实例创建到数据库中。

    请注意,您必须将文件保存在名为fixtures 的文件夹中,否则会返回错误。

    现在,在创建用户时,您将获得标题 ForeignKey 将在选项列表中显示 title_name 而不是 title

    【讨论】:

      【解决方案3】:
      user_title = forms.ModelChoiceField(queryset=Title.objects.all(), flat=True)
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
      猜你喜欢
      • 1970-01-01
      • 2018-07-26
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2020-03-04
      • 2017-04-21
      相关资源
      最近更新 更多