使用不同的用户修改ManyToMany

时间:2013-07-18 15:12:26

标签: django django-forms django-orm

我有模特

Foo:models.py

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

Bar: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作为管理员时,一切正常(添加Foo将另一个Foo放入foo_list)。但是,如果两个用户尝试添加到foo列表,则只有第二个用户将其Foo保存到列表中(添加Foo(s)使foo_list仅包含添加的Foo(s))。这是如何构造的,或者有没有办法让多个用户可以添加到ManyToManyField?

1 个答案:

答案 0 :(得分:0)

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

您可以创建自己不是模型的表单,并提供一个选择多个字段(或其他),然后在保存时执行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将只存储该列表中的已检查值。如果作为管理员,您会看到整个列表(要么没有过滤,要么您创建了所有 那个用户),那么一切都应该按预期工作。