我需要两个模型来创建表单。
def Item(models.Model):
title = models.CharField()
description = models.TextField()
def ItemUser(models.Model):
item = models.ForeignKey(Item)
user = models.ForeignKey(User)
我需要创建一个表单,用户可以创建一个新项目,并能够添加/删除多个ItemUser。由于我使用电子邮件地址作为用户ID,因此我计划将其作为ItemUser的输入。因此表单应该呈现用于获取电子邮件地址的输入框,然后在后端我需要获取这些电子邮件地址的用户ID以保存到ItemUser表中。
如何在Django中实现此表单?
编辑:
添加另一个模型示例以增加清晰度。
def Blog(models.Model):
creator = models.ForeignKey(User)
title = models.CharField()
description = models.TextField()
def BlogAccessUser(models.Model):
blog = models.ForeignKey(Blog)
access_user = models.ForeignKey(User)
每个博客都有一个允许访问它的用户列表。因此,在表单中,用户将创建博客并向该博客添加多个用户。像Google DOCS中的“分享”功能,我可以在我的文档中添加多个用户。
答案 0 :(得分:2)
用户可以在其中创建新项目
因此,这表明Item属于一个用户,一对一的关系。让我们开始吧......
def Item(models.Model):
title = models.CharField()
description = models.TextField()
user = models.OneToOneField(User, related_name="item")
能够添加/删除多个ItemUser
这会建议多对多关系,因此您还需要将其添加到项目模型...
def Item(models.Model):
title = models.CharField()
description = models.TextField()
user = models.OneToOneField(User, related_name="item")
item_users = models.ManyToManyField(ItemUser, related_name="item")
我需要制作表格
为此,您可以创建一个模型表单,您可以在电子邮件中进行过滤,因为您可以看到在创建表单 init 时传递了电子邮件。
class ItemForm(forms.ModelForm):
class Meta:
model = Item
def __init__(self, email=None, *args, **kwargs):
super(ItemForm, self).__init__(*args, **kwargs)
# Representing the many to many related field in Item
ItemUsers = forms.ModelMultipleChoiceField(queryset=ItemUser.objects.filter(user__email=email))
self.fields['item_users'] = forms.ModelChoiceField(queryset=ItemUsers)
多数民众赞成在你看来,只需通过电子邮件进行过滤,form = itemForm(email=email)
上面是写意,所以他们可能会有一些错误,但它应该给你正确的想法,希望这会有所帮助。
答案 1 :(得分:0)
原始问题的答案是在Django中使用formsets。我最终使用InlineFormset并为表单编写自定义呈现方法。我还使用JS来动态添加/删除表单。