【问题标题】:use alternative ForeignKey in Django form在 Django 表单中使用替代 ForeignKey
【发布时间】:2012-05-17 20:08:18
【问题描述】:

我有两个模型:

class Account1(models.Model):
    uuid = models.CharField(max_length=22, unique=True)
    user = models.ForeignKey(User)

class Account2(models.Model):
    uuid = models.CharField(max_length=22, unique=True)
    account_1 = models.ForeignKey(Account1)

“uuid”是一个自定义 CharField,将短 uuid(如“mfAiC”)存储为表单中的索引。 URL 看起来像 /view/uuid/。我想在所有 URL/HTML 中隐藏真实 ID。

以及模型 Account2 的表单:

class Account2Form(forms.ModelForm):
    class Meta:
        model = Account2
        fields = (
            'account_1',
        )

    def __init__(self, user, *args, **kwargs):
        super(Account2Form, self).__init__(*args, **kwargs)
        self.fields['account_1'].queryset = Account1.objects.filter(user=user)

呈现的 HTML 将是:

<select name="account_1" id="id_account_1">
    <option value="" selected="selected">---------</option>
    <option value="1">account 1 name</option>
</select>

我需要的是在表单中使用 uuid 而不是 id,例如:

<select name="account_1" id="id_account_1">
    <option value="" selected="selected">---------</option>
    <option value="mfAiC">account 1 name</option>
</select>

我知道我可以手动完成。我可以禁用 account_1,创建一个诸如 uuid 之类的表单字段,然后为其动态设置选项。然后在表单验证或视图中验证表单数据。

但是还有其他解决方案吗?

【问题讨论】:

  • 既然该字段是唯一的,您有理由不将其用作主键吗?
  • 根据this answer的说法,使用自定义主键会导致潜在问题。但是,是的,您是对的,在我的情况下,这可能是一个很好且简单的解决方案。

标签: django forms django-forms


【解决方案1】:
class Account2Form(forms.ModelForm):
    account_1 = forms.ChoiceField(label='Account 1', choices=(1,1))
    class Meta:
        model = Account2
        fields = (
            'account_1',
        )

    def __init__(self, user, *args, **kwargs):
        super(Account2Form, self).__init__(*args, **kwargs)
        self.fields['account_1'].choices = [(acc1.uuid, acc1.account_name) for acc1 in Account1.objects.filter(user=user)]

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 2016-07-07
    • 2019-04-30
    • 2016-04-12
    • 2017-09-14
    • 1970-01-01
    • 2020-11-16
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多