python 3.x - Force User to Provide Profile Before Saving in Django Admin -


am trying force user provide profile before saved django admin. here profile model

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 using authtools user profile sender auth_user_model. if add new user within admin,they saved if have not provided or filled in profile. want prevent them being saved until fill in profile fields. insights on how this? here admin.py

from django import forms django.contrib.auth import get_user_model django.contrib.auth.forms import passwordresetform django.utils.crypto import get_random_string  authtools.admin import nameduseradmin authtools.forms import usercreationform  user = get_user_model()   class usercreationform(usercreationform):     """     usercreationform 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 1 field gets autocompleted not other, our 'neither         # password or both password' validation 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):     """     useradmin sends password-reset email when creating new user,     unless password entered.     """     inlines = [ userprofileinline, ]     add_form = usercreationform     add_fieldsets = (         (none, {             'description': (                 "enter new user's name , email address , click save."                 " user emailed link allowing them login to"                 " site , set password."             ),             'fields': ('email', 'name',),         }),         ('password', {             'description': "optionally, may set user's password here.",             'fields': ('password1', 'password2'),             'classes': ('collapse', 'collapse-closed'),         }),     )      def save_model(self, request, obj, form, change):         if not change , not obj.has_usable_password():             # django's passwordresetform won't let reset unusable             # password. set above super() don't have 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) 

the best way create custom middleware , check, if logged in user has filled out profile. if not, middleware redirect user view, can fill out profile.

example:

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 

haven't tested code, should started. it's cleanest way of doing , force user fill out profile, otherwise cannot open page on website.

hope helps.


Comments

Popular posts from this blog

php - How to add and update images or image url in Volusion using Volusion API -

javascript - jQuery UI Splitter/Resizable for unlimited amount of columns -

javascript - IE9 error '$'is not defined -