我有UserAdmin
,我定义了UserProfileInline
这样:
from ...
from django.contrib.auth.admin import UserAdmin as UserAdmin_
class UserProfileInLine(admin.StackedInline):
model = UserProfile
max_num = 1
can_delete = False
verbose_name = 'Profile'
verbose_name_plural = 'Profile'
class UserAdmin(UserAdmin_):
inlines = [UserProfileInLine]
我的UserProfile
模型有一些必填字段。
我想要的是强迫用户不仅输入用户名&重复密码,但也至少输入必填字段,以便创建UserProfile
实例并将其与正在添加的User
相关联。
如果我在创建用户时在UserProfileInline
的任何字段中输入任何内容,它会毫无问题地验证表单,但如果我不触摸任何字段,它只会创建用户并且{{{ 1}}。
有什么想法吗?
答案 0 :(得分:1)
检查最近的回答Extending the user profile in Django. Admin creation of users,您需要将内联的empty_permitted
的{{1}}属性设置为form
。就像
False
另一种可能的解决方案是创建您自己的class UserProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UserProfileForm, self).__init__(*args, **kwargs)
if self.instance.pk is None:
self.empty_permitted = False # Here
class Meta:
model = UserProfile
class UserProfileInline(admin.StackedInline):
form = UserProfileForm
(继承自Formset
),如this link中建议的那样。
可能是这样的:
BaseInlineFormSet
然后在class UserProfileFormset(BaseInlineFormSet):
def clean(self):
for error in self.errors:
if error:
return
completed = 0
for cleaned_data in self.cleaned_data:
# form has data and we aren't deleting it.
if cleaned_data and not cleaned_data.get('DELETE', False):
completed += 1
if completed < 1:
raise forms.ValidationError('You must create a User Profile.')
:
InlineModelAdmin
关于第二个选项的好处是,如果UserProfile模型不需要填充任何字段,它仍然会要求您在至少一个字段中输入任何数据。第一种模式没有。