0

私は2つのモデルを持っています:

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」は、短い uuid (「mfAiC」など) をフォームのインデックスとして格納するカスタム CharField です。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>

私が必要とするのは、次のようなフォームで id の代わりに uuid を使用することです:

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

私は手動でそれを行うことができることを知っています。account_1 を無効にして、uuid などのフォーム フィールドを作成し、動的に選択肢を設定できます。次に、フォーム検証またはビューでフォーム データを検証します。

しかし、他の解決策はありますか?

4

1 に答える 1

0
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)]
于 2012-05-09T11:19:41.933 に答える