how to save CustomUser model to another model data - django

here is my code at users/admin.py,
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from store.models import Customer
from .forms import CustomUserCreationForm, CustomUserChangeForm
CustomUser = get_user_model()
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['email', 'username',]
admin.site.register(CustomUser, CustomUserAdmin)
Also users/forms.py code is,
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('email', 'username',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ('email', 'username',)
I have table on store/models.py ,
class Customer(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, null=True, blank=True,unique=True)
#name = models.CharField(max_length=200, null=True)
email = models.EmailField(max_length=200, null=True)
def __str__(self):
return self.user.username
Now can anyone please suggest me how to create a customer instances in user/admins.py or how to save data to customer table.

Related

Profile model (extending custom user model) not getting registered in django admin

I am new to django and totally confused so what should i do for these..
Note- list_display = ('email', 'first_name',) 'email', 'first_name' which defined in custom user model User
I am not getting errors but it not registering the Profile model
to admin why?
if i am adding phone from Profile model to list_display = ('email', 'first_name', 'phone') i m getting error (admin.E108) The value of 'list_display[2]' refers to 'phone', which is not a callable, an attribute of 'UserAdmin', or an attribute or method on 'users.User'. How can i add phone in list_display?
I uses post_save_user_model_receiver() to auto create profile when
user is created is it best way to do it?
how can i add all Profile model fields for edit/update in users.admin (which is below).
profile model
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import post_save
from django.contrib.auth import get_user_model # or from users.models import User
User = get_user_model()
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
photo = models.ImageField(null=True, blank=True)
date_of_birth = models.DateField(null=True, blank=True)
phone = models.IntegerField(null=True, blank=True)
country = models.CharField(max_length=150, null=True, blank=True)
city = models.CharField(max_length=150, null=True, blank=True)
bio = models.TextField(max_length=150, null=True, blank=True)
def __str__(self):
return str(self.user.email)
def post_save_user_model_receiver(sender, instance, created, *args, **kwargs ):
if created:
try:
Profile.objects.create(user=instance) # it create those user's profile
except:
pass
post_save.connect(post_save_user_model_receiver, sender=User)
Admin
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth import get_user_model
from .models import Profile
User = get_user_model()
# Define an inline admin descriptor for Employee model
# which acts a bit like a singleton
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'profile'
# Define a new User admin
class UserAdmin(BaseUserAdmin):
inlines = (ProfileInline,)
list_display = ('email', 'first_name',)
list_filter = ('admin', 'staff', 'active')
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ()
# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
users.admin file
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth import get_user_model # or from .models import User
from .forms import UserAdminCreationForm, UserAdminChangeForm
# Register your models here.
User = get_user_model() # or from .models import User
class UserAdmin(BaseUserAdmin):
# The forms to add and change user instances
form = UserAdminChangeForm
add_form = UserAdminCreationForm
# The fields to be used in displaying the User model.
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('email', 'first_name', 'get_phone', 'last_login', 'date_joined', 'is_admin')
list_filter = ('admin', 'staff', 'active')
list_select_related = ('profile',)
def get_phone(self, instance): # to show the Phone in list display from the Profile Model
return instance.profile.phone
get_phone.short_description = 'Phone'
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Personal Info', {'fields': ('first_name', 'last_name',)}),
('Permissions', {'fields': ('admin', 'staff', 'active')}),
)
# add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
# overrides get_fieldsets to use this attribute when creating a user.
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'first_name', 'last_name', 'password1', 'password2', )
}
),
)
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ()
admin.site.register(User, UserAdmin)
# Remove Group Model from admin. We're not using it.
admin.site.unregister(Group)

Extending default user using Abstract User

I am trying to add some extra fields in default user model. But the new fields is not showing up in admin page. Here are the models of 'users' app.
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
q1 = models.TextField()
q2 = models.TextField()
forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreation(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
fields = ('username', 'email', 'q1', 'q2')
class CustomUserChange(UserChangeForm):
class Meta:
model = CustomUser
fields = ('username', 'email', 'q1', 'q2')
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreation, CustomUserChange
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreation
form = CustomUserChange
list_display = ['email', 'username', 'password', 'q1', 'q2']
model = CustomUser
admin.site.register(CustomUser, CustomUserAdmin)
P.S. I have added AUTH_USER_MODEL = users.CustomUser in settings.py
In your admin.py file you need to override UserAdmin as:
class CustomUserAdmin(BaseUserAdmin):
form = CustomUserChange
add_form = CustomUserCreation
list_display = ('email', 'username', 'password', 'q1', 'q2')
fields = ('email', 'username', 'password', 'q1', 'q2')
model = CustomUser
admin.site.register(CustomUser, UserAdmin)
Check this example in the docs for more understanding link
Please check the following things into your django project.
Have you added AUTH_USER_MODEL = 'users.models.CustomUser' to your settings.py file ?
Ensure you have added q1 and q2 to your fields attribute in CustomUserAdmin as follow:
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreation
form = CustomUserChange
list_display = ['email', 'username', 'password', 'q1', 'q2']
fields = ['email', 'username', 'password', 'q1', 'q2']
model = CustomUser
You can just create a user profile model with a OneToOne relation and fire it up using signal whenever a user has been added without having to touch the User model.
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
class Profile(models.Model):
user=models.OneToOneField(User, on_delete=models.CASCADE)
q1 = models.TextField()
q2 = models.TextField()
def __unicode__(self):
return self.user.q1
def create_profile(sender, **kwargs):
user = kwargs["instance"]
if kwargs["created"]:
user_profile = Profile(user=user)
user_profile.save()
post_save.connect(create_profile, sender=User)

Using CustomUser as author giving problem with database?

I am a little stuck, i am using CustomUser in settings (AUTH_USER_MODEL = 'users.CustomUser') and i want to use the username as author in comments.
class Comment(models.Model):
post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name='comments')
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
text = models.TextField()
when i run the migrations, it gives me this error
return self.cursor.execute(sql, params) django.db.utils.DataError:
invalid input syntax for integer: "Alandivar"
Alandivar being my superuser username in devmode,
so how can i make it so when a customer put a comment in (requires login), the username is automatically used as author
regards
customuser form
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
from django import forms
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
fields = ('username', 'email')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = UserChangeForm.Meta.fields
customuser model
from django.contrib.auth.models import AbstractUser, UserManager
from django.db import models
class CustomUserManager(UserManager):
pass
class CustomUser(AbstractUser):
objects = CustomUserManager()
customuser view
from django.urls import reverse_lazy
from django.views import generic
from .forms import CustomUserCreationForm
class SignUp(generic.CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('login')
template_name = 'signup.html'

Extend the user model (avatar)?

I want to extend my user model and add avatar(image) field.
I created new app - accounts and inside the models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
def download_location_of_usrpic(instance, filename):
return "%s/%s" %(instance.id, filename)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(
upload_to=download_location_of_usrpic,
null=True,
blank=True,
height_field="height_field",
width_field="width_field"
)
height_field = models.IntegerField(default=0)
width_field = models.IntegerField(default=0)
My admin.py
from accounts.models import Profile
admin.site.register(Profile)
Made makemigrations and migrate
I also have a GCBV
#method_decorator(login_required, name='dispatch')
class UserUpdateView(UpdateView):
model = User
fields = ('first_name', 'last_name', 'email', 'image', )
template_name = 'my_account.html'
success_url = reverse_lazy('my_account')
def get_object(self):
return self.request.user
But I dont see this field in admin and got the mistake in account
Exception Value:
Unknown field(s) (image) specified for User
What did I miss?

admin page does not show list_display fields in django?

my admin page does not show the fields listed in admin.py.
Here is the admin.py
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from customRegistration.models import ExUserProfile
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
model = ExUserProfile
class UserProfileAdmin(UserAdmin):
inlines = [ UserProfileInline, ]
list_display = ('username', 'email','dateofBirth')
admin.site.register(User, UserProfileAdmin)
I do not see the username and dateofBirth field on my admin page.
models.py:
from django.db import models
from registration.models import User
from registration.signals import user_registered
class ExUserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
ishuman = models.BooleanField(required=True)
dateofBirth=models.DateField(required=True)
def __unicode__(self):
return self.user
def user_registered_callback(sender, user, request, **kwargs):
profile = ExUserProfile(user = user)
profile.ishuman = bool(request.POST["ishuman"])
profile.dateofBirth=request.POST["dateofBirth"]
print request.POST["dateofBirth"]
profile.save()
user_registered.connect(user_registered_callback)