要求是many-to-many
和users
之间的projects
关系。
User
和Project
模型都有is_active
属性。
使用更新视图修改User
和Project
时,有一个内联formset。
many-to-many
字段通过中间表控制。
在User
型号上:
projects = models.ManyToManyField(
Project,
through=ProjectMembership
)
在Project
型号上:
users = models.ManyToManyField(
settings.AUTH_USER_MODEL,
through='ProjectMembership'
)
在ProjectMembership
中间模型上,我正在设置limit_choices_to
:
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
limit_choices_to={'is_active': True},
)
project = models.ForeignKey(
Project,
on_delete=models.PROTECT,
limit_choices_to={'is_active': True},
)
在表单集上,用户只能分配给新项目,反之亦然。 问题在于现有项目处于非活动状态。
因此,您可以将活动项目保存到用户:
但是当您将is_active
的{{1}}状态更改为Stackoverflow Answering
时:
然后当您尝试保存时,强制您删除该行:
理想情况下,我希望False
项目为inactive
或根本不可见。
这意味着会覆盖disabled
或get_initial_data
。
他们也不会使用initial queryset
方法进行验证。我该如何具体解决这个问题?
clean
:
Formset
class ProjectMembershipForm(forms.ModelForm):
class Meta:
model = ProjectMembership
fields = (
'user',
'project',
'is_project_manager',
)
ProjectMembershipFormSet = forms.inlineformset_factory(
Project,
ProjectMembership,
form=ProjectMembershipForm,
extra=1,
can_delete=True
)
:
UserUpdateView
答案 0 :(得分:0)
你是如何做你的表格的?基于类的视图?更新视图? FormView控件?如果您发布您的观看代码,我将能够提供更好的答案。
如果您使用任何形式的视图,解决方案应该非常简单。您只需要将所需的查询集作为参数传递给表单域。
class AddProjectToUserForm(forms.form):
projects = forms.ModelChoiceField(queryset=Partner.objects.filter(is_active=True))
编辑:对于modelForm,请尝试以下方法:
class ProjectMembershipForm(forms.ModelForm):
class Meta:
model = ProjectMembership
fields = (
'user',
'project',
'is_project_manager',
)
def __init__(self, *args, **kwargs):
super(ProjectMembershipForm, self).__init__(*args, **kwargs)
self.fields['project'].queryset = Project.objects.filter(is_active=True)
self.fields['user'].queryset = User.objects.filter(is_active=True)
self.fields
保存对表单上所有字段的引用,并允许您在将它们发送到浏览器之前覆盖disabled
之类的属性。如果您想了解更多相关信息,请将import ipdb; ipdb.set_trace()
放入init方法并在self.fields
内闲逛。
我希望有所帮助。
编辑二: 在这种情况下,您应该尝试对 init 中的字段进行其他修改。如果“初始”数据是非法的,将该字段设置为禁用该怎么办?
def __init__(self, *args, **kwargs):
super(ProjectMembershipForm, self).__init__(*args, **kwargs)
project = self.fields['project']
if projcet.initial and project.initial not in project.queryset:
project.disabled = True
我不肯定会有效,但类似的事情应该可以解决问题。