在添加模型时强制用户添加某些InlineModelAdmin的实例

时间:2012-04-19 11:19:38

标签: django django-admin

我有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}}。

有什么想法吗?

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.')

中指定该formset
InlineModelAdmin

关于第二个选项的好处是,如果UserProfile模型不需要填充任何字段,它仍然会要求您在至少一个字段中输入任何数据。第一种模式没有。