Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更新用户';id';和用户';简介';作为DJANGO中自定义管理页面中的超级用户_Python_Django_Python 3.x_Request_Django Views - Fatal编程技术网

Python 如何更新用户';id';和用户';简介';作为DJANGO中自定义管理页面中的超级用户

Python 如何更新用户';id';和用户';简介';作为DJANGO中自定义管理页面中的超级用户,python,django,python-3.x,request,django-views,Python,Django,Python 3.x,Request,Django Views,如何从自定义管理员页面更新用户配置文件 我已经在一个特定页面中创建了一个自定义管理仪表板,当我单击用户“全名”时,我会被重定向到一个详细信息更新页面,其中包含我单击的人的pk 不幸的是,使用下面的代码,我从单击的ID接收到登录的超级用户的信息,而不是用户的信息 如何检索被单击的用户的信息以及作为超级用户更新的信息 def employees_directory_profile(request, employee_pk): """ Access profile of employe

如何从自定义管理员页面更新用户配置文件

我已经在一个特定页面中创建了一个自定义管理仪表板,当我单击用户“全名”时,我会被重定向到一个详细信息更新页面,其中包含我单击的人的pk

不幸的是,使用下面的代码,我从单击的ID接收到登录的超级用户的信息,而不是用户的信息

如何检索被单击的用户的信息以及作为超级用户更新的信息

def employees_directory_profile(request, employee_pk):
    """
    Access profile of employee from Employee ListView in dashboard.
    """
    employee = get_object_or_404(Profile, pk=employee_pk)

    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        extended_profile_form = ProfileForm(request.POST,        # Populate image data if POST
                                            request.FILES,
                                            instance=request.user.profile)

        if form.is_valid() and extended_profile_form.is_valid():
            form.save()
            extended_profile_form.save()
            return redirect('accounts:profile')

    else:
        form = EditProfileForm(instance=request.user)
        extended_profile_form = ProfileForm(instance=request.user.profile)



    context = {
            'form':form,
            'extended_profile_form':extended_profile_form,
            'employee':employee
    }

    return render(request, 'accounts/dashboard-employee-active-profile.html', context)

然后当我尝试时:

if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=employee)
        extended_profile_form = ProfileForm(request.POST,        # Populate image data if POST
                                            request.FILES,
                                            instance=employee.profile)

        if form.is_valid() and extended_profile_form.is_valid():
            form.save()
            extended_profile_form.save()
            return redirect('accounts:profile')

    else:
        form = EditProfileForm(instance=employee)
        extended_profile_form = ProfileForm(instance=employee.profile)
我从控制台收到下面的错误消息

AttributeError at /dashboard/employees-directory-profile/10
'Profile' object has no attribute 'profile'
Request Method: GET
Request URL:    http://127.0.0.1:8000/dashboard/employees-directory-profile/10
Django Version: 2.1
Exception Type: AttributeError
Exception Value:    
'Profile' object has no attribute 'profile'
Exception Location: /Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/accel_hr/accounts/views.py in employees_directory_profile, line 212
Python Executable:  /Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/bin/python
Python Version: 3.7.0
Python Path:    
['/Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/accel_hr',
 '/anaconda3/lib/python37.zip',
 '/anaconda3/lib/python3.7',
 '/anaconda3/lib/python3.7/lib-dynload',
 '/Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/lib/python3.7/site-packages']
Server time:    Tue, 14 May 2019 11:24:17 -0400
Traceback Switch to copy-and-paste view
/Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/lib/python3.7/site-packages/django/core/handlers/exception.py in inner
            response = get_response(request) ...
▶ Local vars
/Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/lib/python3.7/site-packages/django/core/handlers/base.py in _get_response
                response = self.process_exception_by_middleware(e, request) ...
▶ Local vars
/Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/lib/python3.7/site-packages/django/core/handlers/base.py in _get_response
                response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/Users/macadmin/Documents/Accel_Capital/Web_apps/accel_hr/accel_hr/accounts/views.py in employees_directory_profile
        extended_profile_form = ProfileForm(instance=employee.profile) 
models.py如下:

from django.db import models
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.urls import reverse

User = settings.AUTH_USER_MODEL

GENDER = (
        ('Male', 'Male'), 
        ('Female', 'Female'))


class Profile(models.Model):


    user = models.OneToOneField(User, on_delete=models.CASCADE)
    birthday = models.CharField(max_length=10, blank=False)
    location = models.CharField(max_length=50, null=True, blank=True)   
    gender = models.CharField(choices= GENDER, max_length=10, default='Male')
    phone_number = models.CharField(max_length=10)
    position = models.CharField(max_length=30)
    created = models.DateTimeField(auto_now_add=True, auto_now=False)
    is_terminated = models.BooleanField(default=False, null=True)                   # Null = True to be removed


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

    def get_absolute_url(self):
        return reverse('accounts:employees-directory-profile', kwargs={'pk': self.pk})


@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    '''
    For every new user created, create new Profile.
    '''
    if created:
        Profile.objects.create(user=instance)
    else:
        instance.profile.save()
forms.py

from django.contrib.auth.models import User
from django import forms
from django.contrib.auth import (
    authenticate,
    login,
    get_user_model

)
from django.contrib.auth.forms import UserChangeForm

from .models import Profile, Document

from django.forms import ModelForm


Profile = get_user_model()


class UserLoginForm(forms.Form):
    ''' 
    Validate Login form username and password.
    '''
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

    def clean(self, *args, **kwargs):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')

        if username and password:
            user = authenticate(username=username, password=password)
            if not user:
                raise forms.ValidationError('This user does not exist')
            if not user.check_password(password):
                raise forms.ValidationError('Incorrect password')
            if not user.is_active:
                raise forms.ValidationError('This user is not active')
        return super(UserLoginForm, self).clean(*args, **kwargs)


class UserRegisterForm(forms.ModelForm):
    ''' 
    Validate Registration form fields.
    '''
    email = forms.EmailField(label='Email address')
    first_name = forms.CharField(label='First name', required=False, help_text='Optional')
    last_name = forms.CharField(label='Last name', required=False, help_text='Optional')
    password = forms.CharField(widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput)



    class Meta:
        model = User
        fields = (
            'username',
            'first_name',
            'last_name',
            'email',
            'password',
            'password2',
        )   

    def clean(self, *args, **kwargs):
        password = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('password2')
        if password != password2:
            raise forms.ValidationError("Passwords must match")
        return super(UserRegisterForm, self).clean(*args, **kwargs)

class EditProfileForm(UserChangeForm):
    '''
    Edit Profile.
    '''

    class Meta:
        model = User 
        fields = (
        'username',
        'first_name',
        'last_name',
        # 'password1',
        # 'password2',
        'email',
        )

    def __init__(self, *args, **kwargs):
        ''' delete password field in edit profile page.'''
        super(EditProfileForm, self).__init__(*args, **kwargs)
        self.fields.pop('password')                           



class ProfileForm(forms.ModelForm):
    GENDER = (
        ('Male', 'Male'), 
        ('Female', 'Female')
        )

    # image = forms.ImageField()
    birthday = forms.CharField(label='Birthday')
    location = forms.CharField(label='Location', required=False)
    gender = forms.CharField(max_length=10, widget=forms.Select(choices=GENDER))
    phone_number = forms.CharField(max_length=10)
    position = forms.CharField(label='Position', max_length=20, required=False)



    class Meta:
        model = Profile
        fields = (
                'birthday', 
                'location', 
                'gender',
                'phone_number',
                'position'
        )



任何帮助都将不胜感激。

您将获得登录用户,因为这是您显式传递到表单中的内容。相反,您应该传递从数据库获得的employee对象

if request.method == 'POST':
    form = EditProfileForm(request.POST, instance=employee)
    extended_profile_form = ProfileForm(request.POST,        # Populate image data if POST
                                        request.FILES,
                                        instance=employee.profile)
    ...
else:
    form = EditProfileForm(instance=employee)
    extended_profile_form = ProfileForm(instance=employee.profile)
(您应该真正考虑重命名您的模型,当用户模型是链接到用户的对象的名称时,调用用户模型“profile”是不好的。)

编辑

这一切都很混乱,主要是因为你误导了表单名称。在原始代码中,您有EditProfileForm编辑
request.user
,即user的实例,而ProfileForm编辑
request.user.profile
,可能是profile的实例。现在
employee
是Profile的一个实例,而不是User。所以你大概想要:

    form = EditProfileForm(instance=employee.user)
    extended_profile_form = ProfileForm(instance=employee)

但实际上,您应该将表单重命名为UserForm,以便我们能够理解实际发生的情况。

您将获得登录用户,因为这是您显式传递到表单中的内容。相反,您应该传递从数据库获得的employee对象

if request.method == 'POST':
    form = EditProfileForm(request.POST, instance=employee)
    extended_profile_form = ProfileForm(request.POST,        # Populate image data if POST
                                        request.FILES,
                                        instance=employee.profile)
    ...
else:
    form = EditProfileForm(instance=employee)
    extended_profile_form = ProfileForm(instance=employee.profile)
(您应该真正考虑重命名您的模型,当用户模型是链接到用户的对象的名称时,调用用户模型“profile”是不好的。)

编辑

这一切都很混乱,主要是因为你误导了表单名称。在原始代码中,您有EditProfileForm编辑
request.user
,即user的实例,而ProfileForm编辑
request.user.profile
,可能是profile的实例。现在
employee
是Profile的一个实例,而不是User。所以你大概想要:

    form = EditProfileForm(instance=employee.user)
    extended_profile_form = ProfileForm(instance=employee)

但实际上,您应该将表单重命名为UserForm,以便我们了解实际发生的情况。

是的,我以前尝试过,应该在问题中提到它。请在上面找到当控制台崩溃时我从控制台收到的消息。那么你需要显示你的实际型号。什么是用户模型,什么是配置文件模型?同时显示表格。请在问题中找到上面编辑的配置文件模型和表格。谢谢,谢谢。它做的工作,我会重新命名,使这个项目更干净的版本。非常感谢你!!!!是的,我以前试过,应该在问题中提到。请在上面找到当控制台崩溃时我从控制台收到的消息。那么你需要显示你的实际型号。什么是用户模型,什么是配置文件模型?同时显示表格。请在问题中找到上面编辑的配置文件模型和表格。谢谢,谢谢。它做的工作,我会重新命名,使这个项目更干净的版本。非常感谢你!!!!