Anton
Anton

Reputation: 199

How to link two tables in django?

I use the built-in User model in django, but i want use some custom fields, i was create new model

class Profile(models.Model):
    user = models.OneToOneField(User)
    profile_img = models.ImageField(null=True)

    def __str__(self):
        return self.user.username

this is my custom model. But when i create new user it doesn't display in admin(in profile table), i need to add user from admin panel, after adding it works fine. what i should to do to display Profile info of all users?

p.s. When i was create table profile and was try to select info from joined tabels, sql query wasn't return anything, but after adding existed user to Profile table sql query return all what i want

Upvotes: 1

Views: 627

Answers (2)

srjjio
srjjio

Reputation: 1049

I am not sure to understand what you want... If you want to manage profile in admin app you have to register it.

from django.contrib import admin
from myproject.myapp.models import Profile

class ProfileAdmin(admin.ModelAdmin):
    pass
admin.site.register(Profile, ProfileAdmin)

Edit: you can use a signal to automatically create a profile when creating a user.

from django.contrib.auth.models import User
from django.db.models.signals import post_save

from myproject.myapp.models import Profile

@receiver(post_save, sender=User)
def create_profile(sender, instance **kwargs):
    Profile.objects.create(user=instance)

Note that sometime using signals may be hard to maintain. You can also use AbstractBaseUser. This is a classical issue, which is widely covered in a lot of posts. One I particularly like: https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html

Upvotes: 1

Nrzonline
Nrzonline

Reputation: 1618

To create a new Profile object when a new user is created, you can use a pre_save receiver:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(
            user=instance
        )

The created parameter is to check if the object has been created ( created=True ) or updated ( created=False )

Upvotes: 1

Related Questions