0

I'm learning django signals and when I'm trying to use simple one which creates Profile directly after new User is created( by default django User model) and whenever I try to runserver, I get this error: RuntimeError: Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS. HOWEVER: django.contrib.contenttypes is in INSTALLED_APPS I'm newbie and I'm stuck.....

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'bootstrapform',
    'basic',

]
# urls
"""Filmweb URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/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
from django.contrib.auth import views as auth_views

from basic.views import Main, ActorsListView, ActorModifyView, ActorCreateView, \
    ActorDeleteView, Films, FilmCreateView, FilmModifyView, FilmDeleteView, Register, RateIt, FilmDetails, Profile, \
    RolesView, RoleModifyView, RestFilmView
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('admin/', admin.site.urls, name='admin'),

    path('main/', Main.as_view(), name='Main'),

    path('films/', Films.as_view(), name='Films'),
    path('films/add', FilmCreateView.as_view(), name='Films_add'),
    path('films/modify/<int:pk>', FilmModifyView.as_view(), name='Films_modify'),
    path('films/delete/<int:pk>', FilmDeleteView.as_view(), name='Films_delete'),
    path('films/details/<int:id>', FilmDetails.as_view(), name='Films_details'),
    path('rate/<int:id>', RateIt.as_view(), name="Rate"),

    path('rest/<int:id>', RestFilmView.as_view(), name="Rate"),

    path('actors/', ActorsListView.as_view(), name='Actors'),
    path('actors/add/', ActorCreateView.as_view(), name='Actors_add'),
    path('actor/modify/<int:id>/', ActorModifyView.as_view(), name='Actor_modify'),
    path('actor/delete/<int:pk>/', ActorDeleteView.as_view(), name='Actor_delete'),

    path('roles/', RolesView.as_view(), name='Roles'),
    path('roles/modify/<int:pk>', RoleModifyView.as_view(), name='Role_modify'),

    # path('actor/modify/<int:id>/', ActorModifyView.as_view(), name='Actor_modify'),
    path('login/', auth_views.LoginView.as_view(), name="Login"),
    path('logout/', auth_views.LogoutView.as_view(), name="Logout"),
    path('register/', Register.as_view(), name="Register"),

    path('profile/', Profile.as_view(), name="Profile"),


] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

#admin 
from django.contrib import admin
from .models import *


# Register your models here.

# @admin.register(Films)
# class FilmAdmin(admin.ModelAdmin):
#     fields = ['title', 'description', 'premiere', 'imdb_rating', 'genre']
#     list_display = ['title', 'description', 'premiere', 'imdb_rating', 'genre']
#     list_filter = ("premiere", "imdb_rating", 'genre')
#     search_fields = ("title", "description", "premiere", 'genre')


admin.site.register(Genre)
admin.site.register(Films)
admin.site.register(Actors)
admin.site.register(Roles)
# admin.site.register(RoleReviews)
admin.site.register(FilmReviews)
# admin.site.register(Profiles)
# admin.site.register(Directors)
# admin.site.register(Messages)

# apps.py
from django.apps import AppConfig
from django.contrib.auth.models import User


class UsersConfig(AppConfig):
    name = 'basic'

    def ready(self):
        import basic.signals

# signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile


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


@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

# models 
from pyexpat import model

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
from django.contrib.auth.models import User


# Create your models here.

class Genre(models.Model):
    # 0 = 'Undefined'
    # 1 = 'SO'
    # 2 = 'JR'
    # 3 = 'SR'
    # 4 = 'GR'
    # YEAR_IN_SCHOOL_CHOICES = [
    #     (FRESHMAN, 'Freshman'),
    #     (SOPHOMORE, 'Sophomore'),
    #     (JUNIOR, 'Junior'),
    #     (SENIOR, 'Senior'),
    #     (GRADUATE, 'Graduate'),
    # ]
    MOVIE_TYPE = {
        (0, 'Undefined'),
        (1, 'Comedy'),
        (2, 'Drama'),
        (3, 'Sci-fi'),
        (4, 'action'),
        (5, 'romantic'),
        (6, 'rom-coms'),
        (7, 'adventure'),
        (8, 'musicals'),
    }

    name = models.PositiveSmallIntegerField(default=0, choices=MOVIE_TYPE)

    def show_genre(self):
        if self.name == 0:
            return 'Undefined'
        elif self.name == 1:
            return 'Comedy'
        elif self.name == 2:
            return 'Drama'
        elif self.name == 3:
            return 'Sci-fun'
        elif self.name == 4:
            return 'Action'
        elif self.name == 5:
            return 'Romantic'
        elif self.name == 6:
            return 'Rom-coms'
        elif self.name == 7:
            return 'Adventure'
        elif self.name == 8:
            return 'Musiclas'

    def __str__(self):
        return f'{self.show_genre()}'


class Films(models.Model):
    title = models.CharField(max_length=64, blank=False, unique=True)
    description = models.TextField(default="")
    premiere = models.DateField(null=True, blank=True)
    duration = models.PositiveSmallIntegerField(default=0)
    imdb_rating = models.DecimalField(max_digits=4, decimal_places=2, null=True, blank=True)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE, null=True, blank=True)
    # directed_by = models.ForeignKey("Directors", null=False, blank=False, on_delete=models.CASCADE)
    poster = models.ImageField(upload_to='posters', null=True, blank=True)
    roles = models.ManyToManyField("Actors", through='Roles', related_name='role')
    film_reviews = models.ManyToManyField(User, through='FilmReviews')

    def __str__(self):
        return self.title_with_year()

    def title_with_year(self):
        return f"{self.title} ({self.premiere})"

    def total_seen(self):
        return FilmReviews.objects.filter(seen=True, film=self).count()


class Actors(models.Model):
    name = models.CharField(max_length=32)
    surname = models.CharField(max_length=32)
    photo = models.ImageField(upload_to='actors', null=True, blank=True)

    def __str__(self):
        return f"{self.name} {self.surname}"


class Roles(models.Model):
    film = models.ForeignKey(Films, on_delete=models.CASCADE, related_name='film_title')
    actor = models.ForeignKey(Actors, on_delete=models.CASCADE, related_name='actor_role')
    role_name = models.CharField(max_length=64, null=False, blank=False)

    # role_photo = models.ImageField(upload_to='roles', null=True, blank=True)
    # role_review = models.ManyToManyField(User, through='RoleReviews')

    def __str__(self):
        return f"{self.film.title} {self.actor.name} {self.actor.surname}"


class FilmReviews(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='User_FilmReviews')
    film = models.ForeignKey(Films, on_delete=models.CASCADE)
    user_rating = models.DecimalField(max_digits=4, decimal_places=2, null=False, blank=False)
    user_review = models.TextField(null=True, blank=True)
    seen = models.BooleanField(default=True)


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='profilepic.jpg', upload_to='profiles', null=True, blank=True)
    location = models.CharField(max_length=100, default='Not your business')

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


0 Answers0