我有模特
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?
答案 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将只存储该列表中的已检查值。如果作为管理员,您会看到整个列表(要么没有过滤,要么您创建了所有 那个用户),那么一切都应该按预期工作。