10

私のモデル:

class End_User(models.Model):
    location = models.ForeignKey(Location) 
    first_name = models.CharField(max_length=70, blank=True, null=True)
    email_address = models.CharField(max_length=70, blank=True, null=True)

class Phone_Client(models.Model):
    end_user = models.ManyToManyField(End_User)
...
    extensions = models.CharField(max_length=20)

class Line(models.Model):
    phone_client = models.ManyToManyField(Phone_Client, through='Phone_Line' )
    ....
    voicemail = models.BooleanField(default=False)  

class Phone_Line(models.Model):
    phone_client = models.ForeignKey(Phone_Client)
    line = models.ForeignKey(Line)
    line_index = models.IntegerField()

つまり、基本的に 1 人のエンド ユーザーが複数の電話を持つことができ、電話は Phone_line を通じて関連付けられた複数の回線を持つことができます。

私のページでは、これらすべてのオブジェクトを編集可能にし、Phone_Clients と Line の実行時に作成された新しいインスタンスをすべて同じページに配置する必要があります。現在、単純な End_User モデル フォームと、Phone_Client および Lines 用の modelformset_factory オブジェクトを作成しています。電話には多くの回線を含めることができるため、phone_formset 内の各電話フォームには回線フォームセット オブジェクトを含めることができます。私は現在、このようなことをしています

end_user = End_User.objects.get(pk=user_id)
user_form = End_UserForm(instance=end_user)

Phone_ClientFormSet = modelformset_factory(Phone_Client,form=PartialPhone_ClientForm,  extra=0, can_delete=True)

phone_clients_formset = Phone_ClientFormSet(queryset=end_user.phone_client_set.all(), prefix='phone_client')

all_lines = modelformset_factory(Line, form=PartialLineForm, extra=0, can_delete=True)

phone_clients = end_user.phone_client_set.all()

client_lines_formsets = {}
for phone in phone_clients:
    client_lines_formsets[phone.id] = all_lines(queryset=phone.line_set.all(), prefix='phone_client_'+str(phone.id))

このリストを使用して、フォームセットを使用してテンプレート内の phone_client に属する行を表示しています。

モデルについて次の質問があります

  1. inline_formset ファクトリを使用して、スルー クラスを含む多対多の関係を処理できますか? もしそうなら、関係を介してPhone_Client、Line、およびPhone_Lineに対してそれを行うにはどうすればよいですか?

  2. 特定の電話と回線の組み合わせの line_index を表示する必要がありますが、テンプレートでそれを行うにはどうすればよいですか?
    djangoテンプレートから多対多の「スルー」テーブルのプロパティにアクセスするにはどうすればよいですか? 表示するだけではなく、可能であれば回線または電話フォームセットで値を電話、回線の組み合わせにバインドして、ユーザーがインデックスを変更した場合に、フォームセットデータを投稿しながらデータベースに保存できるようにします。

私はdjangoが初めてなので、どんな助けも本当に感謝しています。ありがとう!!

4

1 に答える 1

17

ご存知かもしれませんが、インラインフォームセットを使用して多対多の関係を編集することはできません。ただし、スルーモデルは編集できます。したがって、インラインフォームセットの場合は、モデルをスルーモデルに設定する必要があります。例:

inlineformset_factory(Phone_Client, Line.phone_client.through)

line_index実際にはインラインフォームの表示フィールドになるため、実際には何もする必要はありません。誰かがインデックスを変更した場合、他のフィールドと同様に、インラインフォームが保存されるときにインデックスが保存されます。

于 2012-06-13T20:11:26.033 に答える