1

我有两个模型需要为其创建表单。

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

4

2 回答 2

2

用户可以在哪里创建新项目

所以这表明一个项目属于一个用户,一对一的关系。所以让我们从这个开始......

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)

以上是手绘的,所以可能会有一些错误,但它应该给你正确的想法,希望这会有所帮助。

于 2013-04-14T08:27:02.090 回答
0

原始问题的答案是在 Django 中使用表单集。我最终使用了 InlineFormset 并为表单编写了自定义渲染方法。我还使用 JS 来动态添加/删除表单。

于 2013-05-16T12:37:29.657 回答