Объект «Profile» не имеет атрибута get

#python

#python

Вопрос:

Привет, ребята, у меня были некоторые ошибки при отображении шаблона профиля, поэтому, пожалуйста, мне нужна ваша помощь в этом, на это ушло много часов.

я получаю ошибки после аутентификации пользователя, и пользователь здесь может получить доступ ко всем страницам, кроме страницы профиля, которую он приносит. Объект «Profile» не имеет атрибута get.

мой models.py

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

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile", blank=True, null=True)
    username = models.CharField(max_length=100, null=True)
    password = models.CharField(max_length=100, null=True)
    email = models.CharField(max_length=100, null=True)
    phone = models.IntegerField(blank=True, default=0000 - 000 - 000)
    region = models.CharField(max_length=100, null=True)
    image = models.ImageField(default='usr profile.PNG ', upload_to='images', null=True, blank=True)

    def __str__(self):
        return self.usernamelot of hours finding solutions.
 

мой form.py

 from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.forms import ModelForm

from .models import *

class ProfileForm(ModelForm):
    class Meta:
        model = Profile
        fields = '__all__'
        exclude = ['user']
 

мой views.py

 from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponse  # responsible for GET,method
from django.shortcuts import render, redirect

from .decorators import unauthenticated, allowed_users, admin_only
from .forms import *

@login_required(login_url='contractors:login')
@allowed_users(allowed_roles=['customer'])
def userProfile(request):
    customers = request.user.profile
    forms = ProfileForm(customers)

    if request.method == 'POST':
        try:
            forms = ProfileForm(request.POST, request.FILES, instance=customers)
            if forms.is_valid:
                forms.save()
                messages.success(request, 'successfully saved')

        except ValueError:
            messages.error(request, 'Oops!! no any information validated')

    context = {'forms': forms}
    return render(request, 'profile.html', context)
 

мой url.py

 from django.urls import path

from . import views

app_name = 'contractors'
urlpatterns = [
    path('', views.index, name='login'),
    path('logout/', views.logoutPage, name='logout'),
    path('register/', views.registration, name='register'),
    path('home/', views.home, name='home'),
    path('user-profile/', views.userProfile, name='profile'),
    path('chatting/', views.chatting, name='chat'),
    path('ceo/', views.ceo, name='ceo'),
    path('managers/', views.managers, name='managers')
 

]

мой profile.html

 {% extends 'base.html' %}
{% block content %}



    <style>

      .image{
       max-width: 200px;
       max-height: 200px;
       margin: 0 auto;
       radius: 50%;
            }


    .cstm-height-card .card-img-top {
    height: 100px;
    object-fit: cover;

    }
    .bs-example{
    margin: 20px;
    }


      #message{
         background-color: #4CAF50;
         color: blue;
         padding: 13px;
         float: right;
         margin-right: 20px;
         margin-top: 70px;

      }


    </style>
    {% for message in messages %}
    <div id="message">{{message}}</div>
    {% endfor %}
    <div class="bs-example">
        <nav class="navbar navbar-expand-md navbar-dark bg-dark">
            <a href="#" class="navbar-brand">
                <img src="/examples/images/logo.svg" height="48" alt="CoolBrand">
            </a>
            <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbarCollapse">
                <span class="navbar-toggler-icon"></span>
            </button>

            <div class="collapse navbar-collapse" id="navbarCollapse">
                <div class="navbar-nav">
                    <a href="#" class="nav-item nav-link active">Ghana contractors</a>
                    <a href="#" class="nav-item nav-link">Profile</a>
                    <a href="#" class="nav-item nav-link">Messages</a>
                    <a href="#" class="nav-item nav-link disabled" tabindex="-1">Reports</a>
                </div>

                <hr>
                <div style="color:#fdfff8;">
                    Hi ! {{ request.user}}
                </div>
                <div class="navbar-nav ml-auto">
                    <div style="background:#5c869d;"><a href="{% url 'contractors:logout' %}" class="nav-item nav-link">
                        <text style="color:#fdfff8;">Logout</text>
                    </a></div>
                </div>
            </div>
        </nav>
    </div>


    <div class="container">
        <div class="row">
            <div class="col-md-3">
                <div class="card card-body">
                    <img class="image" src=" {{ request.user.profile.image.url}}" alt="">
                </div>
            </div>

            <div class="col">
                <div class="card card-body">
                    <form method='POST' action="" enctype="multipart/form-data">
                        {% csrf_token %}
                        {{ forms.as_p }}


                        <input class='btn btn-primary' type="submit" name="submit" value="update">
                    </form>
                </div>
            </div>
        </div>

    </div>
    {% endblock %}
 

my signals.py

 from django.db.models.signals import post_save
from django.contrib.auth.models import User  # the  sender
from django.contrib.auth.models import Group

from .forms import ProfileForm
from .models import Profile  # receiver
from .views import userProfile


#  if registration as the sender with the user function sending info to the profile as created by users

def my_profile(sender, instance, created, **kwargs):
    if created:
        group = Group.objects.get(name='customer')
        instance.groups.add(group)

        Profile.objects.create(
            user=instance,  # the receiver  when user registered so as to send the info to its profile
            username=instance.username,
            email=instance.email
        )
        print('successfully created')


post_save.connect(my_profile, sender=User)
 

мой decorators.py

 from django.http import HttpResponse
from django.shortcuts import redirect

def allowed_users(allowed_roles=[]):
    def decorator(view_func):
        def wrapped_func(request, *args, **kwargs):

            group = None
            if request.user.groups.exists():
                group = request.user.groups.all()[0].name

            if group in allowed_roles:
                return view_func(request, *args, **kwargs)

            else:
                return HttpResponse('sorry !!! you are not authorized to view this page')

        return wrapped_func

    return decorator
 

Трассировка:

 Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/contractors/user-profile/

Django Version: 3.0.1
Python Version: 3.9.0
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'Contractors.apps.ContractorsConfig']
Installed 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']


Template error:
In template C:UsersuserPycharmProjectsSamali Holdingstemplatebase.html, error at line 0
   'Profile' object has no attribute 'get'
   1 : <!DOCTYPE html>
   2 :     <html lang="en">
   3 :     <head>
   4 :         <!-- Required meta tags -->
   5 :         <meta charset="utf-8">
   6 :         <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=yes">
   7 : 
   8 :         <!-- Bootstrap CSS -->
   9 : 
   10 :         <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"


Traceback (most recent call last):
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangocorehandlersexception.py", line 34, in inner
    response = get_response(request)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangocontribauthdecorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:UsersuserPycharmProjectsSamali HoldingsContractorsdecorators.py", line 25, in wrapped_func
    return view_func(request, *args, **kwargs)
  File "C:UsersuserPycharmProjectsSamali HoldingsContractorsviews.py", line 77, in userProfile
    return render(request, 'profile.html', context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoshortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplateloader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebackendsdjango.py", line 61, in render
    return self.template.render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 171, in render
    return self._render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 903, in render_annotated
    return self.render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplateloader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 903, in render_annotated
    return self.render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplateloader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 903, in render_annotated
    return self.render(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 986, in render
    output = self.filter_expression.resolve(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 670, in resolve
    obj = self.var.resolve(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 795, in resolve
    value = self._resolve_lookup(context)
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangotemplatebase.py", line 857, in _resolve_lookup
    current = current()
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoformsforms.py", line 294, in as_p
    return self._html_output(
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoformsforms.py", line 197, in _html_output
    top_errors = self.non_field_errors()  # Errors that should be displayed above all fields.
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoformsforms.py", line 308, in non_field_errors
    return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield'))
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoformsforms.py", line 175, in errors
    self.full_clean()
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoformsforms.py", line 376, in full_clean
    self._clean_fields()
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoformsforms.py", line 388, in _clean_fields
    value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
  File "C:UsersuserPycharmProjectsSamali Holdingslibsite-packagesdjangoformswidgets.py", line 258, in value_from_datadict
    return data.get(name)

Exception Type: AttributeError at /contractors/user-profile/
Exception Value: 'Profile' object has no attribute 'get'
 

эй, ребята, я прошу вас об этом с помощью простых решений

Ответ №1:

во-первых, django-forms не принимает позиционные аргументы в запрошенной вами форме, но принимает только аргументы ключевых слов

поэтому, что делать, создайте экземпляр: forms = profileForm(customers) в (instance=customers)

вот и все, что решило мою задачу в различных туториалах