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でユーザープロファイルを拡張します。ユーザーの管理者作成では、インラインののempty_permitted属性をに設定する必要があります。と同じようにformFalse

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

この2番目のオプションの良い点は、UserProfileモデルでフィールドに入力する必要がない場合でも、少なくとも1つのフィールドにデータを入力するように求められることです。最初のモードはそうではありません。

于 2012-04-19T12:36:39.300 に答える