2016-11-08 5 views
0

django管理者から保存する前にプロファイルを提供するよう強制しています。ここ はauthtoolsを使用して、私のプロファイルモデルユーザーがDjango管理者に保存する前にプロファイルを提供するようにします

class UserProfile(models.Model): 

    user=models.OneToOneField(AUTH_USER_MODEL,related_name='profile',primary_key=True) 
    #other fields 

    def get_user_info(user): 
     return UserProfile.objects.get(user=user) 
    @receiver(post_save, sender=AUTH_USER_MODEL) 
    def create_profile_for_new_user(sender, created, instance, **kwargs): 
     if created: 
      profile = UserProfile(user=instance) 
      profile.save() 

Amはので、ユーザープロファイルの送信者がAUTH_USER_MODELです。 管理者の中から新しいユーザーを追加すると、プロフィールを入力していない場合でも保存されます。 プロフィールフィールドに記入するまで保存されないようにします。 これを行う方法に関する洞察はありますか?ここ は、ログインしているユーザーは、プロフィールを記入した場合は、これを行うための最善の方法は、カスタムミドルウェアを作成し、チェックすることです私のadmin.py

from django import forms 
from django.contrib.auth import get_user_model 
from django.contrib.auth.forms import PasswordResetForm 
from django.utils.crypto import get_random_string 

from authtools.admin import NamedUserAdmin 
from authtools.forms import UserCreationForm 

User = get_user_model() 


class UserCreationForm(UserCreationForm): 
    """ 
    A UserCreationForm with optional password inputs. 
    """ 

    def __init__(self, *args, **kwargs): 
     super(UserCreationForm, self).__init__(*args, **kwargs) 
     self.fields['password1'].required = False 
     self.fields['password2'].required = False 
     # If one field gets autocompleted but not the other, our 'neither 
     # password or both password' validation will be triggered. 
     self.fields['password1'].widget.attrs['autocomplete'] = 'off' 
     self.fields['password2'].widget.attrs['autocomplete'] = 'off' 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1") 
     password2 = super(UserCreationForm, self).clean_password2() 
     if bool(password1)^bool(password2): 
      raise forms.ValidationError("Fill out both fields") 
     return password2 


class UserAdmin(NamedUserAdmin): 
    """ 
    A UserAdmin that sends a password-reset email when creating a new user, 
    unless a password was entered. 
    """ 
    inlines = [ UserProfileInline, ] 
    add_form = UserCreationForm 
    add_fieldsets = (
     (None, { 
      'description': (
       "Enter the new user's name and email address and click save." 
       " The user will be emailed a link allowing them to login to" 
       " the site and set their password." 
      ), 
      'fields': ('email', 'name',), 
     }), 
     ('Password', { 
      'description': "Optionally, you may set the user's password here.", 
      'fields': ('password1', 'password2'), 
      'classes': ('collapse', 'collapse-closed'), 
     }), 
    ) 

    def save_model(self, request, obj, form, change): 
     if not change and not obj.has_usable_password(): 
      # Django's PasswordResetForm won't let us reset an unusable 
      # password. We set it above super() so we don't have to save twice. 
      obj.set_password(get_random_string()) 
      reset_password = True 
     else: 
      reset_password = True 

     super(UserAdmin, self).save_model(request, obj, form, change) 

     if reset_password: 
      reset_form = PasswordResetForm({'email': obj.email}) 
      assert reset_form.is_valid() 
      reset_form.save(
       subject_template_name='registration/account_creation_subject.txt', 
       email_template_name='registration/account_creation_email.html', 
      ) 


admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 
+0

シグナルハンドラ(create_profile_for_new_user)がUserProfileの下にあるとは思わない。 –

+0

こんにちはLauri Elias 1あなたが思う通りに投稿した方が好きです:) – Joshua

+0

新しい認証ユーザーが作成されるたびに信号を使用して、認証プロファイルを作成するようにします。 –

答えて

0

です。そうでなければ、ミドルウェアはユーザをビューにリダイレクトし、そこで彼はプロファイルを記入することができる。

例:

class ProfileMiddleware(MiddlewareMixin): 
    def __init__(self, get_response=None): 
     self.get_response = get_response 

    def process_view(self, request, view_func, view_args, view_kwargs): 
     if not request.user.profile: 
      return HttpResponseRedirect(reverse('create-profile')) 
     return None 

は、コードをテストしていませんが、それはあなたが始める必要があります。これを行う最もクリーンな方法であり、ユーザーにプロファイルを記入させなければなりません。それ以外の場合は、Webサイトでページを開くことができません。

これが役に立ちます。

関連する問題