如何在 DJANGO 的自定义 ADMIN 页面中将用户“id”和用户“profile”更新为超级用户

柯蒂斯班克斯

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

我在特定页面中创建了一个自定义管理仪表板,当我点击用户“全名”时,我被重定向到一个详细信息更新页面,其中包含我点击的人的 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()

表格.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'
        )


任何帮助将非常感激。

丹尼尔罗斯曼

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

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)

(你真的应该考虑重命名你的模型,当它是链接到用户的事物的名称时,将用户模型称为“配置文件”是不好的。)

编辑

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django CRUD中自定义auth.User Admin页面?

如何使用自定义用户从Django admin中的User继承字段?

如何在使用自定义用户模型时修复django admin中的“无法解压不可迭代的NoneType对象”错误

使用自定义用户模型成功创建超级用户后无法登录django admin

Django Admin-自定义创建用户表单

如何自定义 Django 用户模型?

Django Admin自定义页面和功能

Django Admin:如何访问登录用户以在自定义“list_display”字段中使用它?

Django Restful:如何更新我的自定义用户模型?

在Django 1.11中为自定义用户在admin中添加额外字段

如何在 react admin 自定义登录页面中使用户名未定义?

无法使用自定义用户和Mezzanine / South登录到Django Admin

如何在Django-admin中添加自定义搜索框?

如何在Django Admin中向更改模型表单添加自定义操作?

Django:Django admin中未出现“自定义用户模型”字段

如何在Django中显示自定义错误页面

如何在 django 中创建自定义 ID?

我如何在 wp admin 的 woocomerce 订单详细信息页面上显示自定义用户数据

Django自定义用户---在admin中编辑新的CustomUser字段

django admin中未显示自定义用户模型字段(AbstractUser)

Django admin中的自定义M2M验证未显示给用户

自定义用户模型不遵循 django admin 中扩展的 BaseUserManager 实现

我可以在Django Admin中看到自定义用户密码哈希

如何在Django中将默认用户数据迁移到自定义用户模型

Django自定义用户管理页面

Django admin中的自定义验证

Django Admin的自定义布尔图标

django admin中的自定义项

Django-Admin 自定义 ImageField