#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)
вот и все, что решило мою задачу в различных туториалах