我的模特:
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()
所以基本上一个终端用户可以拥有多部手机,一部手机可以拥有多条线路,通过Phone_line相关。
我的页面需要编辑所有这些对象,并为同一页面中的Phone_Clients和Line all创建运行时的新实例。目前我正在为Phone_Client和Lines创建一个简单的End_User模型表单和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))
我使用此列表使用formsets在模板中显示属于phone_client的行。
我在模型上有以下问题
我可以使用inline_formset工厂来处理包含直通类的多对多关系吗?如果是这样,我如何通过关系为Phone_Client,Line和Phone_Line做到这一点?
我需要显示给定手机,线组合的line_index,我该如何在模板中执行此操作?我看过了 How do I access the properties of a many-to-many "through" table from a django template? 我不想只显示,但是如果可能的话,在行或电话formset中将值绑定到电话,行组合,这样如果用户更改了索引,我可以在发布formset数据时将其保存在数据库中。 / p>
我是django的新手,所以任何帮助都非常感谢。 谢谢!
答案 0 :(得分:15)
您可能已经意识到,您无法使用内联表单集编辑多对多关系。但是,您可以编辑直通模型。因此,对于内联formset,您只需将模型设置为直通模型,例如:
inlineformset_factory(Phone_Client, Line.phone_client.through)
line_index
实际上是内联表单中的可见字段,因此您实际上无需执行任何操作。如果有人更改了索引,则会在保存内联表单时保存它,就像其他字段一样。