JudahSan/chat-app

Circular import error

Closed this issue · 3 comments

I keep getting this error

ImportError: cannot import name 'UserEditForm' from 'users.forms'

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 134, in inner_run
    self.check(display_num_errors=True)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/base.py", line 475, in check
    all_issues = checks.run_checks(
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/registry.py", line 88, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 24, in check_resolver
    return check_method()
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 494, in check
    for pattern in self.url_patterns:
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 715, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 708, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/chatproject/urls.py", line 23, in <module>
    path('users/', include('users.urls')),
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/conf.py", line 38, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/urls.py", line 3, in <module>
    from . import views
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/views.py", line 2, in <module>
    from .forms import LoginForm, UserRegistrationForm, UserEditForm, ProfileEditForm
ImportError: cannot import name 'UserEditForm' from 'users.forms' (/home/jooda/python_projects/DjangoChatApp/chatproject/users/forms.py)
/home/jooda/python_projects/DjangoChatApp/chatproject/users/views.py changed, reloading.
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
January 25, 2023 - 15:08:34
Django version 4.1.5, using settings 'chatproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[25/Jan/2023 15:08:43] "GET /admin/auth/user/ HTTP/1.1" 200 9375
[25/Jan/2023 15:08:43] "GET /admin/jsi18n/ HTTP/1.1" 200 3343
[25/Jan/2023 15:08:43] "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 288580
[25/Jan/2023 15:08:43] "GET /static/admin/js/vendor/xregexp/xregexp.js HTTP/1.1" 200 232381
/home/jooda/python_projects/DjangoChatApp/chatproject/users/views.py changed, reloading.
Watching for file changes with StatReloader
Performing system checks...

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 134, in inner_run
    self.check(display_num_errors=True)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/base.py", line 475, in check
    all_issues = checks.run_checks(
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/registry.py", line 88, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 24, in check_resolver
    return check_method()
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 494, in check
    for pattern in self.url_patterns:
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 715, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 708, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/chatproject/urls.py", line 23, in <module>
    path('users/', include('users.urls')),
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/conf.py", line 38, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/urls.py", line 3, in <module>
    from . import views
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/views.py", line 7, in <module>
    from .forms import UserEditForm, ProfileEditForm
ImportError: cannot import name 'UserEditForm' from 'users.forms' (/home/jooda/python_projects/DjangoChatApp/chatproject/users/forms.py)
/home/jooda/python_projects/DjangoChatApp/chatproject/users/models.py changed, reloading.
Watching for file changes with StatReloader
Performing system checks...

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 134, in inner_run
    self.check(display_num_errors=True)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/base.py", line 475, in check
    all_issues = checks.run_checks(
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/registry.py", line 88, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 24, in check_resolver
    return check_method()
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 494, in check
    for pattern in self.url_patterns:
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 715, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 708, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/chatproject/urls.py", line 23, in <module>
    path('users/', include('users.urls')),
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/conf.py", line 38, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/urls.py", line 3, in <module>
    from . import views
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/views.py", line 7, in <module>
    from .forms import UserEditForm, ProfileEditForm
ImportError: cannot import name 'UserEditForm' from 'users.forms' (/home/jooda/python_projects/DjangoChatApp/chatproject/users/forms.py)
^C(env) jooda@jooda-HP-ENVY-Notebook:~/python_projects/DjangoChatApp/chatproject$ python manage.py validate --traceback
Unknown command: 'validate'. Did you mean validate_templates?
Type 'manage.py help' for usage.
(env) jooda@jooda-HP-ENVY-Notebook:~/python_projects/DjangoChatApp/chatproject$ ls
chatproject  db.sqlite3  manage.py  media  users
(env) jooda@jooda-HP-ENVY-Notebook:~/python_projects/DjangoChatApp/chatproject$ python manage.py check --traceback
Traceback (most recent call last):
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/manage.py", line 22, in <module>
    main()
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/base.py", line 402, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/base.py", line 448, in execute
    output = self.handle(*args, **options)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/commands/check.py", line 76, in handle
    self.check(
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/management/base.py", line 475, in check
    all_issues = checks.run_checks(
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/registry.py", line 88, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/core/checks/urls.py", line 24, in check_resolver
    return check_method()
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 494, in check
    for pattern in self.url_patterns:
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 715, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/resolvers.py", line 708, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/chatproject/urls.py", line 23, in <module>
    path('users/', include('users.urls')),
  File "/home/jooda/python_projects/DjangoChatApp/env/lib/python3.10/site-packages/django/urls/conf.py", line 38, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/urls.py", line 3, in <module>
    from . import views
  File "/home/jooda/python_projects/DjangoChatApp/chatproject/users/views.py", line 7, in <module>
    from .forms import UserEditForm, ProfileEditForm
ImportError: cannot import name 'UserEditForm' from 'users.forms' (/home/jooda/python_projects/DjangoChatApp/chatproject/users/forms.py)

views.py file

from django.shortcuts import render
from .forms import LoginForm, UserRegistrationForm, UserEditForm, ProfileEditForm
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from .models import Profile



# Create your views here.
def user_login(request):
  if request.method == 'POST':
    form = LoginForm(request.POST)
    if form.is_valid():
      data = form.cleaned_data
      user = authenticate(request, username=data['username'], password=data['password'])
      if user is not None:
        login(request, user)
        return HttpResponse("user authenticated and logged in")
      else:
        return HttpResponse("Invalid credentials")

  else:
    form = LoginForm()
  return render(request, 'users/login.html', {'form':form})

@login_required
def index(request):
  return render(request, 'users/index.html')

def register(request):
  if request.method == 'POST':
    user_form = UserRegistrationForm(request.POST)
    if user_form.is_valid():
      new_user = user_form.save(commit=False)
      new_user.set_password(user_form.cleaned_data['password'])
      new_user.save()
      Profile.objects.create(user=new_user)
      return render(request, 'users/register_done.html')
  else:
    user_form = UserRegistrationForm()
  return render(request, 'users/register.html', {'user_form': user_form} )

  # Edit view
@login_required
def edit(request):
  if request.method == 'POST':
    user_form = UserEditForm(instance=request.user, data=request.POST)
    profile_form = ProfileEditForm(instance=request.user.profile, data=request.POST, files=request.FILES)
    if user_form.is_valid() and profile_form.is_valid():
      user_form.save()
      profile_form.save()
  else:
    user_form=UserEditForm(instance=request.user)
    profile_form=ProfileEditForm(instance=request.user.profile)
  return render(request, 'users/edit.html', {'user_form':user_form, 'profile_form':profile_form})

forms.py file

from django import forms
from django.contrib.auth.models import User
from .models import Profile

class UserEditForm(forms.ModelForm):
  class Meta:
    model = User
    fields = ('first_name', 'last_name', 'email')

class ProfileEditForm(forms.ModelForm):
  class Meta:
    model = Profile
    fields = ('photo',)

class LoginForm(forms.Form):
  username = forms.CharField()
  password = forms.CharField(widget=forms.PasswordInput)

# User registration form

class UserRegistrationForm(forms.ModelForm):
  # meta class

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

  class Meta:
    model = User
    fields = {'username', 'email', 'first_name'}

  # Check if passwords match
  def check_password(self):
    if self.cleaned_data['password'] != self.cleaned_data['password2']:
      raise forms.ValidationError('Passwords do not match')
    return self.cleaned_data['password2']

Solutions

old

from .forms import LoginForm, UserRegistrationForm, UserEditForm, ProfileEditForm

new

from .forms import *