1

フォームを作成する必要がある 2 つのモデルがあります。

def Item(models.Model):
    title = models.CharField()
    description = models.TextField()

def ItemUser(models.Model):
    item = models.ForeignKey(Item)
    user = models.ForeignKey(User)

ユーザーが新しいアイテムを作成し、複数のアイテムユーザーを追加/削除できるフォームを作成する必要があります。メールアドレスをユーザー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

ユーザーが新しいアイテムを作成できる場所

したがって、これはアイテムが 1 人のユーザー、1 対 1 の関係に属していることを示唆しています。それでは、これから始めましょう...

def Item(models.Model):
    title = models.CharField()
    description = models.TextField()
    user = models.OneToOneField(User, related_name="item")

複数の ItemUser を追加/削除できる

これは多対多の関係を示唆するため、これを item モデルにも追加する必要があります...

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 を使用し、フォームのカスタム render メソッドを作成しました。また、JS を使用してフォームを動的に追加/削除しました。

于 2013-05-16T12:37:29.657 に答える