0

私はモデルを持っています

フー:models.py

name = models.CharField(max_length=100)
user = models.ForeignKey(User)

バー: models.py

owner = models.ForeignKey(User)
user_list = models.ManyToManyField(User, related_name='user_list')
foo_list = models.ManyToManyField(Foo)

バー オブジェクト用の独自のユーザー管理サイトを作成しました。

admin.py

class BarAdmin(admin.ModelAdmin):
    model = Bar
    form = BarForm

    def __init__(self, model, user_admin_site):
        self.form.user_admin_site = user_admin_site 
        super(BarAdmin, self).__init__(model, user_admin_site)

    def get_form(self, request, obj=None, **kwargs):
        form = super(BarAdmin, self).get_form(request, obj, **kwargs)
        form.current_user = request.user
        return form

    def save_model(self, request, obj, form, change):
        if change:
            pass
        else:
            obj.owner = request.user
            obj.save()

    user_admin_site = UserAdmin(name='usersadmin')

    user_admin_site.register(Foo)
    user_admin_site.register(Bar, BarAdmin)

Foos をバーに追加するためのカスタム フォームがあります。

フォーム.py

class BarForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BarForm, self).__init__(*args, **kwargs)
        self.fields['foo_list'] = forms.ModelMultipleChoiceField(queryset=Foo.objects.filter(user=self.current_user))
        rel = ManyToOneRel(Foo, 'id')
        self.fields['foo_list'].widget = RelatedFieldWidgetWrapper(self.fields['foo_list'].widget, rel, self.user_admin_site)

    class Meta:
        model = Bar
        exclude = ['owner']

ユーザーは、ユーザー リストにあるバーのみを表示および編集できます。デフォルトの管理サイトから管理者として Foos を Bar に追加すると、すべて正常に動作します (Foo を追加すると、別の Foo が foo_list に追加されます)。ただし、2 人のユーザーが foo リストに追加しようとすると、2 番目のユーザーだけがその Foo をリストに保存します (Foo を追加すると、foo_list には追加された Foo のみが含まれます)。これが構造化されている方法に問題がありますか、または複数のユーザーが ManyToManyField に追加できるようにする方法はありますか?

4

1 に答える 1

0

フォームが保存されるたびに foo_list を上書きしていると思います。新しい foo オブジェクトを古いものに置き換えるのではなく、それらを追加するには、ある種のカスタム保存ロジックを使用する必要があります。

モデルフォームではない独自のフォームを作成し、selectmultiple フィールド (または何でも) を提供してから、保存時に実行することができます。bar.foo_list.add(foo)

編集: フォーム フィールドから返された各 foo に対して、bar.foo_list.add(foo)

edit2: これをコメントとして残したかったのですが、フォーマットが制限されています。あなたが管理者ならうまくいくと言いましたか?すべての foo オブジェクトが表示されますか、それとも作成したものだけが表示されますか? これがすべて foo オブジェクトであり、 foo_list 内のオブジェクトがチェックされているとしましょう:

[ ] myfoo1
[x] myfoo2
[ ] myfoo3
[ ] otherfoo1
[x] otherfoo2

ユーザーにのみ表示される場合:

[ ] myfoo1
[x] myfoo2
[ ] myfoo3

それを保存すると、foo_list はそのリストからチェックされた値のみを保存します。管理者としてリスト全体が表示される場合 (フィルタリングされていないか、そのユーザーとしてすべての foo を作成したかのいずれか)、すべてが期待どおりに機能するはずです。

于 2013-07-18T15:46:22.983 に答える