【问题标题】:Modify ManyToMany with different users用不同的用户修改 ManyToMany
【发布时间】:2013-07-17 15:12:44
【问题描述】:

我有模型

Foo: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 对象创建了自己的用户管理站点。

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 添加到 Bar。

forms.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?

【问题讨论】:

    标签: django django-forms django-orm


    【解决方案1】:

    我认为您每次保存表单时都会覆盖 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 将只存储该列表中检查的值。如果作为管理员,您看到整个列表(或者它没有被过滤,或者您创建了所有 foos as 该用户),那么一切都应该按预期工作。

    【讨论】:

    • 我将深入研究主管理站点代码,看看它是否是这样做的(因为如果我是管理员,它就可以工作)。
    • 是的,您的描述就是正在发生的事情。作为管理员,我可以看到所有可以添加到 Bar 的 Foo 对象,而不管它是谁创建的。作为用户,您只能看到您创建的 Foo 对象。所以我想我的问题是,是否有办法让用户能够通过一组受限的选择添加到关系中。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多