【问题标题】:How to display a ForeignKey field in a ModelForm with no default value?如何在没有默认值的 ModelForm 中显示 ForeignKey 字段?
【发布时间】:2021-02-09 03:45:32
【问题描述】:

我需要为Player 创建一个表单,该表单将Role 对象作为下拉字段中的选项,但改为显示它们的字符串字段。

models.py

class Player(models.Model):
    role = models.ForeignKey(role)
    ...

class Role(models.Model):
    designation = models.CharField()

forms.py

class PlayerForm(ModelForm):
    class Meta:
        model = Player
        fields = ['role']

假设我有三个role 对象,它们分别作为它们的designations:WarriorMageRouge,我如何在PlayerForm 实例中将其显示为下拉列表,使用没有默认值,所以用户必须选择一个?

目前此代码将对象显示为对象本身(Role object (1)Role object (2)、...)

【问题讨论】:

    标签: python python-3.x django django-forms


    【解决方案1】:

    我认为这主要是渲染对象的问题。您可以定义一个__str__ 方法来指定Roles 应该如何呈现:

    class Role(models.Model):
        designation = models.CharField(max_length=128, unique=True)
    
        def __str__(self):
            return self.designation

    您可能还希望将designation 设置为unique=True 字段,以防止使用相同的designation 定义两个Role

    【讨论】:

    • 我必须将其定义为__str__,而不是别的吗?如果我需要显示其他字段,我将如何在代码中说明?
    • @mashedpotatoes:你返回__str__中的另一个字段(或几个字段的字符串插值)。
    • 还有应该没有默认值的部分。下拉列表仍然显示------,虽然这可以通过在Meta 类声明上方的表单中添加role_id = forms.ModelChoiceField(Role.objects.all(), empty_label=None) 来解决,但它会查询Role 对象。有没有更好的方法,或者可以这样做/或者没有其他方法可以解决?
    • @mashedpotatoes:这个选项表明你还没有选择一个值。如果您使用---- 提交表单,表单将拒绝它,因为这意味着您没有选择值。您可以指定一个默认值,bit,因为您不想这样做,那么最初应该在下拉列表中选择什么值?
    【解决方案2】:

    添加

    def __str__(self):
        return self.designation 
    

    到你的Role 班级,你所有的选择都会变成真实姓名)

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 2015-09-10
      • 2018-07-17
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多