What is the proper workflow before first migration?

50 views
Skip to first unread message

silverst...@gmail.com

unread,
Apr 5, 2019, 10:58:19 AM4/5/19
to Django users
Hello, I've been trying to make a social media site and know nothing about django (i've been teaching myself using the documentation and tutorials) I've had to redo the site three times and now have to do a fourth because (even though I got AUTH_USER_MODEL in, all the forms ect. ect. before first migration) for some reason it is saying that "Manager is unavailable; auth.User has been swapped for public_posts.CustomUser". I have not been able to find a decent description on exactly how work flow NEEDS to be done. Obviously create user models and set AUTH_USER_MODEL before first migration but what about the Manager? I made my CustomUserManager at the same time as everything else.

I tried to use django-registration, then found out they upgraded to django_registration, couldn't find ANY documentation on it until almost a week afterwards. So now my code is partially a bunch of tutorials and partially old (possibly deprecated) code, is there somewhere that all of the new stuff and how to transfer to the new stuff posted? This seems to be the hardest part about Django, for me anyway. I've tried get_user_model where user comes up to no avail.  I have three apps, admin_posts, public_posts and accounts (get ready to smirk cuz this was stupid of me) I have all my CustomUser stuff in public_posts and have everything required by django_registration in accounts. I'm positive that was a huge fail on my part but Where SHOULD all of the user stuff go?? I have no been able to find anything about that anywhere everything only says ' appname.CustomUser' (example) leading me to believe that it doesn't matter where you put them. but since django_registration has its own requirements and user dealings, will using django_registration and CustomUsers cancel each other out/mess up each others managers?

Everything I have done has only been in my project(s) and not in the root dir. Also, if anyo contributors to django read this, thank you for making such a freaking amazing framework, I mean this thing is just a pure beauty so thank you!!! Y'all be some geniuses! I hope to be good enough to contribute.

Thank you for making it to the end and thank you for any responses.
P.S I only post as a last resort, I've spent HOURS researching this to no avail, not even a tease of an answer...I'm only saying this so you know I do indeed do the research required and don't want others to do  my work for me but MAN I cannot find anything. Also, if any Django contributors read this, Thank you for making such an amazing framework!!!!!!

silverst...@gmail.com

unread,
Apr 5, 2019, 11:06:43 AM4/5/19
to Django users
Something odd is that when the Manager unavailable error comes up, the path in the terminal is " "POST /accounts/accounts/templates/registration/ HTTP/1.1"   Why does accounts come up twice????

jgi...@caktusgroup.com

unread,
Apr 5, 2019, 5:16:00 PM4/5/19
to Django users
Hi,

Can you post the structure of your app, including project root?  Setting up a CustomUser Model is not a simple task, especially if you are new to the framework.

silverst...@gmail.com

unread,
Apr 5, 2019, 9:14:05 PM4/5/19
to Django users
I should have added that, sorry.
freeThought
├── admin_posts
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   └── urls.py
│   │   ├── views.py
│   │   └── static
│   │   └── templates
├── accounts
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   └── urls.py
│   │   ├── views.py
│   │   ├── static
│   │   └── templates
├── public_post
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── forms.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   └── urls.py
│   │   ├── views.py
│   │   ├── static
│   │   └── templates
├── freeThought
│   │   ├── settings.py
│   │   ├── urls.py
│   │   ├── wsgi.py
----------------------------------------
admin_posts/
-----------------------------------------
# admin_posts/admin.py


from django.contrib import admin
from .models import Post

admin
.site.register(Post)


# admin_posts/models.py


from django.conf import settings
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser

# Create your models here.
class Post(models.Model):
    author
= models.ForeignKey('public_posts.CustomUser', related_name='Custmod', on_delete=models.CASCADE)
    title
= models.CharField(max_length=200)
    text
= models.TextField()
    created_date
= models.DateTimeField(default=timezone.now)
    published_date
= models.DateTimeField(blank=True, null=True)

   
def publish(self):
       
self.published_date = timezone.now()
       
self.save()

   
def __str__(self):
       
return self.title




# admin_posts/urls.py


from django.urls import path
from . import views
urlpatterns
= [
    path
('', views.mod_posts, name='mod_posts')
   
]




# admin_posts/views.py


from django.shortcuts import render
from django.utils import timezone
from .models import Post


def mod_posts(request):
    posts
= Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
   
return render(request, 'admin_posts/mod_posts.html', {'posts': posts})




===========================
accounts/
===========================
# accounts/urls.py

from django.urls import path
from django.conf.urls import url
from django.views.generic.base import TemplateView

from . import views

urlpatterns
= [
    path
('accounts/templates/registration/', views.SignUp.as_view(), name='signup'),
    path
('templates/registration/', TemplateView.as_view(template_name='login.html'), name='login'),
    path
('templates/registration/', TemplateView.as_view(template_name='registration_complete.html'), name='registration_complete'),
    path
('templates/registration/', TemplateView.as_view(template_name='activation_failed.html'), name='activation_failed'),
    path
('templates/registration/', TemplateView.as_view(template_name='activation_complete.html'), name='activation_complete'),
    path
('templates/registration/', TemplateView.as_view(template_name='activation_email_subject.txt'), name='activation_email_subject'),
    path
('templates/registration/', TemplateView.as_view(template_name='activation_email_body.txt'), name='activation_email_body'),
]



------------------------------------------
# accounts/views.py

from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic

# Create your views here.
class SignUp(generic.CreateView):
    form_class
= UserCreationForm
    success_url
= reverse_lazy('login')
    template_name
= 'registration/registration_form.html'
   
def activate(request, backend,
         template_name
='registration/activate.html',
         success_url
=None, extra_context=None, **kwargs):

    backend
= get_backend(backend)
    account
= backend.activate(request, **kwargs)

   
if account:
       
if success_url is None:
            to
, args, kwargs = backend.post_activation_redirect(request, account)
           
return redirect(to, *args, **kwargs)
       
else:
           
return redirect(success_url)

   
if extra_context is None:
        extra_context
= {}
    context
= RequestContext(request)
   
for key, value in extra_context.items():
        context
[key] = callable(value) and value() or value

   
return render_to_response(template_name,
                              kwargs
,
                              context_instance
=context)

========================
public_posts/
==============================
# public_posts/admin.py
# public_posts/admin.py
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from .models import CustomUser, CustomUserManager
from public_posts.forms import CustomUserChangeForm, CustomUserCreationForm
from django.contrib.auth.models import Group

class CustomUserAdmin(UserAdmin):
   
# The forms to add and change user instances

   
# The fields to be used in displaying the User model.
   
# These override the definitions on the base UserAdmin
   
# that reference the removed 'username' field
    fieldsets
= (
       
(None, {'fields': ('email', 'password')}),
       
(_('Personal info'), {'fields': ('first_name', 'last_name')}),
       
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                       
'groups', 'user_permissions')}),
       
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
   
)
    add_fieldsets
= (
       
('fields', {
           
'classes': ('wide',),
           
'fields': ('email', 'password1', 'password2')}
       
),
   
)
    form
= CustomUserChangeForm
    add_form
= CustomUserCreationForm
    list_display
= ('email', 'first_name', 'last_name', 'is_staff')
    search_fields
= ('email', 'first_name', 'last_name')
    ordering
= ('email',)

admin
.site.register(CustomUser, CustomUserAdmin)
admin
.site.unregister(Group) # I put this here because someone on a forum said it may help... It didn't




# public_posts/forms.py
# public_posts/forms.py

from django.contrib.auth.forms import UserCreationForm, UserChangeForm, forms

from public_posts.models import CustomUser
from django.contrib.auth import get_user_model
User = get_user_model()
class CustomUserCreationForm(UserCreationForm):
   
"""
    A form that creates a user, with no privileges, from the given email and
    password.
    """

    password1
= forms.CharField(label='Password', widget=forms.PasswordInput)
    password2
= forms.CharField(label='Password Confirmation', widget=forms.PasswordInput)


   
def __init__(self, *args, **kargs):
       
super(CustomUserCreationForm, self).__init__(*args, **kargs)
       
del self.fields['username']

   
class Meta:
        model
= User
        fields
= ('email', 'first_name', 'last_name',)

class CustomUserChangeForm(UserChangeForm):
   
"""A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """

   
def __init__(self, *args, **kargs):
       
super(CustomUserChangeForm, self).__init__(*args, **kargs)
       
del self.fields['username']

   
class Meta:
        model
= User
        fields
= ('email', 'first_name', 'last_name',)




# public_posts/models.py

# public_posts/models.py
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.utils.http import urlquote
from django.utils.translation import ugettext_lazy as _
from django.core.mail import send_mail
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.contrib.auth.models import BaseUserManager
from django.contrib.auth import get_user_model

class CustomUserManager(BaseUserManager):

   
def _create_user(self, email, password,
                     is_staff
, is_superuser, **extra_fields):
       
"""
        Creates and saves a User with the given email and password.
        """

        now
= timezone.now()
       
if not email:
           
raise ValueError('The given email must be set')
        email
= self.normalize_email(email)
        user
= self.model(email=email,
                          is_staff
=is_staff, is_active=True,
                          is_superuser
=is_superuser, last_login=now,
                          date_joined
=now, **extra_fields)
        user
.set_password(password)
        user
.save(using=self._db)
       
return user

   
def create_user(self, email, password=None, **extra_fields):
       
return self._create_user(email, password, False, False,
                                 
**extra_fields)

   
def create_superuser(self, email, password, **extra_fields):
       
return self._create_user(email, password, True, True,
                                 
**extra_fields)
   
   
class CustomUser(AbstractBaseUser, PermissionsMixin):
   
"""
    A fully featured User model with admin-compliant permissions that uses
    a full-length email field as the username.

    Email and password are required. Other fields are optional.
    """

    email
= models.EmailField(_('email address'), max_length=254, unique=True)
    first_name
= models.CharField(_('first name'), max_length=30, blank=True)
    last_name
= models.CharField(_('last name'), max_length=30, blank=True)
    is_staff
= models.BooleanField(_('staff status'), default=False,
        help_text
=_('Designates whether the user can log into this admin '
                   
'site.'))
    is_active
= models.BooleanField(_('active'), default=True,
        help_text
=_('Designates whether this user should be treated as '
                   
'active. Unselect this instead of deleting accounts.'))
    date_joined
= models.DateTimeField(_('date joined'), default=timezone.now)

    objects
= CustomUserManager()

    USERNAME_FIELD
= 'email'
    REQUIRED_FIELDS
= []

   
class Meta(object):
        verbose_name
= _('user')
        verbose_name_plural
= _('users')

   
def get_absolute_url(self):
       
return "/users/%s/" % urlquote(self.email)

   
def get_full_name(self):
       
"""
        Returns the first_name plus the last_name, with a space in between.
        """

        full_name
= '%s %s' % (self.first_name, self.last_name)
       
return full_name.strip()

   
def get_short_name(self):
       
"Returns the short name for the user."
       
return self.first_name

   
def email_user(self, subject, message, from_email=None):
       
"""
        Sends an email to this User.
        """

        send_mail
(subject, message, from_email, [self.email])




# Create your models here.
class Post(models.Model):
    author
= models.ForeignKey('CustomUser', on_delete=models.CASCADE)
    title
= models.CharField(max_length=200)
    text
= models.TextField()
    created_date
= models.DateTimeField(default=timezone.now)
    published_date
= models.DateTimeField(blank=True, null=True)

   
def publish(self):
       
self.published_date = timezone.now()
       
self.save()

   
def __str__(self):
       
return self.title






# public_posts/urls.py
from django.urls import path
from . import views

urlpatterns
= [
    path
('', views.pub_post_list, name='pub_post_list'),
    path
('signup/', views.SignUp.as_view(), name='signup'),

]





# public_posts/views.py


from django.shortcuts import render
from django.utils import timezone
from .models import Post
from django.urls import reverse_lazy
from django.views import generic
from .forms import CustomUserCreationForm


# Create your views here.
def pub_post_list(request):
    posts
= Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
   
return render(request, 'public_posts/pub_posts.html', {'posts': posts})


class SignUp(generic.CreateView):
    form_class
= CustomUserCreationForm
    success_url
= reverse_lazy('login')
    template_name
= 'registration_form.html'



------------------------------------------
Message has been deleted

silverst...@gmail.com

unread,
Apr 5, 2019, 9:29:36 PM4/5/19
to Django users
settings.py

"""
Django settings for freeThought project.

Generated by 'django-admin startproject' using Django 2.1.7.

For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""


import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR
= os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY
= '#####################################'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG
= True

ALLOWED_HOSTS
= []


# Application definition

INSTALLED_APPS
= [
   
'django.contrib.admin',
   
'django.contrib.auth',
   
'django.contrib.contenttypes',
   
'django.contrib.sessions',
   
'django.contrib.messages',
   
'django.contrib.staticfiles',
   
'public_posts',
   
'admin_posts',
   
'accounts.apps.AccountsConfig',
]

MIDDLEWARE
= [
   
'django.middleware.security.SecurityMiddleware',
   
'django.contrib.sessions.middleware.SessionMiddleware',
   
'django.middleware.common.CommonMiddleware',
   
'django.middleware.csrf.CsrfViewMiddleware',
   
'django.contrib.auth.middleware.AuthenticationMiddleware',
   
'django.contrib.messages.middleware.MessageMiddleware',
   
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF
= 'freeThought.urls'

TEMPLATES
= [
   
{
       
'BACKEND': 'django.template.backends.django.DjangoTemplates',
       
'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join('public_posts/', 'templates'), os.path.join('accounts/', 'templates')],
       
'APP_DIRS': True,
       
'OPTIONS': {
           
'context_processors': [
               
'django.template.context_processors.debug',
               
'django.template.context_processors.request',
               
'django.contrib.auth.context_processors.auth',
               
'django.contrib.messages.context_processors.messages',
           
],
       
},
   
},
]

WSGI_APPLICATION
= 'freeThought.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES
= {
   
'default': {
       
'ENGINE': 'django.db.backends.sqlite3',
       
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   
}
}


# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS
= [
   
{
       
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
   
},
   
{
       
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
   
},
   
{
       
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
   
},
   
{
       
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
   
},
]


# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE
= 'en-us'

TIME_ZONE
= 'UTC'

USE_I18N
= True

USE_L10N
= True

USE_TZ
= True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL
= '/static/'
LOGIN_REDIRECT
= 'home'
LOGOUT_REDIRECT
= 'logged_out'
AUTH_USER_MODEL
= 'public_posts.CustomUser'
DEFAULT_USER_MANAGER
= 'public_posts.CustomUserManager' # This is here because I read it may help...it didn't


Root urls.py

"""freeThought URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:

Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""

from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url
from django.views.generic.base import TemplateView

# SET HOME AS PERSONAL BLOG PAGE
urlpatterns
= [
    path
('admin/', admin.site.urls),
    path
('registration/', TemplateView.as_view(template_name='registration_form.html'), name='signup'),
    path
('public_posts/', include('public_posts.urls')),
    path
('admin_posts/', include('admin_posts.urls')),
    path
('public_posts/', include('django.contrib.auth.urls')),
    path
('admin_posts/', TemplateView.as_view(template_name='mod_posts.html'), name='mod_posts'),
    path
('public_posts/', TemplateView.as_view(template_name='pub_posts.html'), name='pub_posts'),
    path
('accounts/', include('accounts.urls')),
    url
(r'^accounts/', include('django_registration.backends.activation.urls')),
    url
(r'^accounts/', include('django.contrib.auth.urls')),
]




On Friday, April 5, 2019 at 5:16:00 PM UTC-4, jgi...@caktusgroup.com wrote:

dtdave

unread,
Apr 6, 2019, 10:25:51 AM4/6/19
to Django users
The error you are getting  is because the CustomUser is not included in your settings.py
Because I use a separte user model my settings.py has this line in it:
AUTH_USER_MODEL = 'users.CustomUser'
I would recommend that you have your Custom User as a separate user model.
For  good tutorials on user models have a look at these links:

Django All-Auth is a good app for customising your user models:
Hope this helps!

Flip Matter

unread,
Apr 10, 2019, 8:45:27 AM4/10/19
to django...@googlegroups.com
Thank you very much for the resources! However it is installed in my settings.py the exact line is...  AUTH_USER_MODEL = 'public_posts.CustomUser'
Is there a different way to do it? This is the only way I have seen to set your AUTH_USER_MODEL, or does my custom user model have to be in a 'users' app?


--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/5aedce0e-870b-48ea-89cb-98e7b022d66d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

dtdave

unread,
Apr 10, 2019, 12:34:07 PM4/10/19
to Django users

To me the way I build my models is so that if anyone looked at the code they would see exactly what the model represented. I had a great mentor in Daniel Greenfield of Two Scoops Fame.
So my models would be users and then a separate model for public posts.
The you have the following in your settings
AUTH_USER_MODEL = 'users.CustomUser'
and everything would br fine.
You could then use this users modle elsewhere.
Also I have never seen the templates done your way. You can just have a single:
'DIRS': [os.path.join(BASE_DIR, 'templates')],
Then you can either have your templates in under the relevant app name e.g
public_posts/templates/public_posts
or in one template folder split into the apps. Different people have there own ideal method so it is really up tp you.
Hope this helps
To unsubscribe from this group and stop receiving emails from it, send an email to django...@googlegroups.com.

Flip Matter

unread,
Apr 12, 2019, 5:04:18 PM4/12/19
to django...@googlegroups.com
Django you so much, I believe having a separate Post model would be the way to go. Recifes to get going on allauth and that's turning out to be way easier than I expected so all of you have basically fixed everything so thank you VERY much. Now I just need to figure out how to do email verification and I'll be good to get the rest of the site done.

To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.

To post to this group, send email to django...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.

David Turner

unread,
Apr 13, 2019, 1:16:08 AM4/13/19
to django...@googlegroups.com
If you are using django allauth and include this in your settings.py
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'

then you will be good to go.
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this group and all its topics, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.

silverst...@gmail.com

unread,
Apr 16, 2019, 4:06:14 PM4/16/19
to Django users
THANK YOU SO MUCH. Good lord almighty I simply cannot believe that I was missing just one line.....one line kept me from continuing my website. Again, thank you so much, it has taken no joke about a month to find out this one little thing. Couldn't find ANYTHING like that in any docs I've seen. Do you possibly have the link to the updated docs? Because for some reason, everytime I go to look for them, it's almost always deprecated. I love you man lol you made my life so much easier!

--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this group and all its topics, send an email to django...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.

silverst...@gmail.com

unread,
Apr 16, 2019, 5:22:49 PM4/16/19
to Django users
Question though, where should I put the seperate model for Posting? Should I just make an app called Posts and do everything to do with posts in that?


On Saturday, April 13, 2019 at 1:16:08 AM UTC-4, dtdave wrote:

--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this group and all its topics, send an email to django...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages