在Django中,如何实现一个表单来为项目分配多个用户?

时间:2013-04-13 23:20:44

标签: django django-models django-forms

我需要两个模型来创建表单。

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中的“分享”功能,我可以在我的文档中添加多个用户。

2 个答案:

答案 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来动态添加/删除表单。