0

2つのユーザーレベルのアプリがあります。スーパーユーザー、およびスタッフ。スーパーユーザーはこのアプリにログインして新しいユーザーを作成し、ユーザーにスーパーユーザーまたはスタッフのアクセス許可を割り当てますが、デフォルトのDjango管理者を介してログインするのではなく、カスタム管理者にログインします。フォームに権限チェックボックスを表示するにはどうすればよいですか?また、作成中の新しいユーザーのためにそれらを保存するにはどうすればよいですか?それは単なる通常のチェックボックスですか、それともこれを達成するためにオーバーライドする必要があるものがありますか?

これが私のCreateUserFormです。

class CreateUserForm(forms.Form):
    username = forms.EmailField(max_length=50)
    email = forms.EmailField()
    first_name = forms.CharField(max_length=150)
    last_name = forms.CharField(max_length=150)
    password1 = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False), label='Password')
    password2 = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False), label='Password Confirmation')
    address_1 = forms.CharField(max_length=50)
    address_2 = forms.CharField(max_length=50)
    city = forms.CharField(max_length=50)
    province = forms.CharField(max_length=2)
    country = forms.CharField(max_length=50)
    postal_code = forms.CharField(max_length=10)
    work_phone = forms.CharField(max_length=20)
    mobile_phone = forms.CharField(max_length=20)
    fax = forms.CharField(max_length=20)
    url = forms.CharField()
    comments = forms.CharField(widget=forms.Textarea)

    def clean_username(self):
        try:
            User.objects.get(username=self.cleaned_data['username'])
        except User.DoesNotExist:
            return self.cleaned_data['username']
        raise forms.ValidationError("Sorry, this username has already been taken. Please choose another.")

    def clean_email(self):
        try:
            User.objects.get(email=self.cleaned_data['email'])
        except User.DoesNotExist:
            return self.cleaned_data['email']
        raise forms.ValidationError("Sorry, this email has already been taken. Please choose another.")

    def clean(self):
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError("You must type the same password each time.")
            if ' ' in self.cleaned_data['username']:
                raise forms.ValidationError("username must not contain spaces")
        return self.cleaned_data

    def save(self):
        new_user = User.objects.create_user(
            username = self.cleaned_data['username'],
            email = self.cleaned_data['email']
        )
        new_user.first_name = self.cleaned_data['first_name']
        new_user.last_name = self.cleaned_data['last_name']
        new_user.set_password(self.cleaned_data['password'])
        new_user.is_active = True
        new_user.save()

    new_profile = UserProfile(
        # TODO:
    )

ありがとう

4

1 に答える 1

2

is_staffとis_superuserのアクセス許可チェックボックスを意味する場合は、おそらくユーザーモデル付きのModelFormを使用するのが最善です。これにより、すべてが自動的に処理されます。

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        exclude = ('last_login', 'date_joined')

OPの更新ごとに編集: is_superadminとis_staffの2つforms.BooleanField()のフィールドをフォームに追加するだけで(または別の名前を付けることができます)、saveメソッドですでに行っているのと同じように実行できますnew_user.is_staff = self.cleaned_data['is_staff']。代わりに、「通常ユーザー」、「スタッフユーザー」、「管理者ユーザー」の3つのエントリを含むドロップダウンを使用して選択フィールドを使用し、ユーザーの選択に応じてis_staffとis_superadminを設定することを検討してください。

ユーザーモデルでModelFormを使用して、必要なフィールドを追加することもできます。あなたがどのように習慣を身につけているかに応じて、それはあなたにとって価値があるかもしれないし、そうでないかもしれません。

フォームに関するもう1つの注意点-既存のユーザーの編集に関しては、ユーザー名/電子メールの現在のクリーンメソッドではこれを使用できません。ただし、現在のインスタンス(設定されている場合)をルックアップから除外するように調整すると、このフォームを使用して既存のユーザーを編集できます(ただし、モデルフォームではないため、初期データを手動で入力する必要があります)。

于 2012-06-21T16:00:43.923 に答える