0

我有一个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,它会毫无问题地验证表单,但如果我不触摸任何字段,它只会创建用户并且UserProfile.

有什么想法吗?

4

1 回答 1

1

检查最近的答案在 Django 中扩展用户配置文件。管理员创建用户,需要设置inline的empty_permitted属性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(继承自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

class UserProfileInline(admin.StackedInline):
    formset = UserProfileFormset
    ....

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

于 2012-04-19T12:36:39.300 回答