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)

我为 bar 对象创建了自己的用户管理站点。

管理员.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 添加到 Bar。

表格.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)。但是,如果两个用户尝试添加到 foo 列表中,则只有第二个用户会将他们的 Foo(s) 保存到列表中(添加 Foo(s) 会使 foo_list 仅包含添加的 Foo(s))。它的结构是否有问题,或者有没有办法让多个用户可以添加到 ManyToManyField?

4

1 回答 1

0

我认为您每次保存表单时都会覆盖 foo_list 。您需要使用某种自定义保存逻辑将新的 foo 对象添加到旧对象中,而不是替换它们。

您可以创建自己的不是模型表单的表单,并提供一个 selectmultiple 字段(或其他),然后在保存时执行bar.foo_list.add(foo)

编辑:我的意思是对于从表单字段返回的每个 foo,做bar.foo_list.add(foo)

编辑2:我想将此作为评论,但格式有限制。你说如果你是管理员就可以了?您看到所有的 foo 对象还是只看到您创建的对象?假设这是所有 foo 对象,检查了 foo_list 中的对象:

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

如果用户只看到:

[ ] myfoo1
[x] myfoo2
[ ] myfoo3

然后当他们保存它时, foo_list 将只存储该列表中的检查值。如果作为管理员,您看到了整个列表(或者它没有被过滤,或者您该用户的身份创建了所有 foos),那么一切都应该按预期工作。

于 2013-07-18T15:46:22.983 回答