사용자 지정 사용자 모델을 사용하는 동안 Django의 프로필 소유자로 편집을 제한하는 데 문제가 있습니다.

레자 잔디

그래서 저는 사용자 지정 사용자 모델을 사용하여 등록 페이지를 사용자 지정하고 사용자가 등록 중에 사진을 제출하도록 요구하기로 결정했습니다. 이를 위해이 모든 과정을 거쳐야하는지 확실하지 않으며 사용자 지정 사용자 클래스를 관리하는 것이 더 어렵다는 것을 알게되었습니다. 지금은 현재 로그인 한 사용자 만 다른 사람의 정보가 아닌 자신의 정보를 편집 할 수 있도록 허용하려고합니다. 일반 사용자 모델을 통해이 작업을 수행하는 방법을 완전히 알고 있지만 사용자 지정 사용자 모델 경로를 통해이를 수행하는 방법을 알 수 없습니다. 이 작업을 수행하는 방법을 아는 유일한 방법은 내 프로필 모델 '소유자'에 대한 외래 키가있는 별도의 모델을 만들고 현재 사용자가 다른 사람의 프로필을 편집하려고 할 때 두 ID를 비교하는 것입니다. 몇 가지 다른 관련 질문을 둘러 봤는데 t도 해결책을 제시합니다. 내가 얻은 최고는 소유자를 위해 '사용자'대신 'settings.Auth_User_Model을 수행했지만 작동하지 않습니다.

오류:

django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
dating_app.Profile.owner: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.
    HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.

models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager, User
class ProfileManager(BaseUserManager):

def create_user(self, username, email,description,photo, password=None):
    if not email:
        raise ValueError("You must creat an email")
    if not username:
        raise ValueError("You must create a username!")
    if not description:
        raise ValueError("You must write a description")
    if not photo:
        raise ValueError("You must upload a photo")

    user = self.model(
            email=self.normalize_email(email),
            username = username, 
            description= description,
            photo= photo,

        )

    user.set_password(password)
    user.save(using=self._db)
    return user 


def create_superuser(self, username, email,description,photo, password):
    user = self.create_user(
            email=self.normalize_email(email),
            password=password,
            username=username,
            description=description,
            photo=photo,

        )

    user.is_admin=True
    user.is_staff=True
    user.is_superuser=True
    user.save(using=self._db)
    return user
class Profile(AbstractBaseUser):

email                       = models.EmailField(verbose_name="email")
username                    = models.CharField(max_length=30, unique=True)
date_joined                 = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login                  = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin                    = models.BooleanField(default=False)
is_active                   = models.BooleanField(default=True)
is_staff                    = models.BooleanField(default=False)
is_superuser                = models.BooleanField(default=False)
#what I added
description                 = models.TextField()
photo                       = models.ImageField(upload_to='profile_photo',blank=False, height_field=None, width_field=None, max_length=100)
owner                       = models.ForeignKey(User, on_delete=models.CASCADE)


USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['description','photo','email']


objects = ProfileManager()


def __str__(self):
    return self.username


def has_perm(self, perm, obj=None):
    return self.is_admin


def has_module_perms(self,app_label):
    return True

update_account 및 소유자에 대한 Views.py

def update_account(request, profile_id):
    #Edit an existing profile 
    profile = get_object_or_404(Profile,id=profile_id)
    update_form = ProfileUpdateForm(request.POST, request.FILES)
    check_profile_owner(profile.owner,request.user)

    if request.method != 'POST':
        #Initial request; prefil form with current entry
        update_form = ProfileUpdateForm(instance=profile)
    else:
        #POST data submitted;process data. 
        update_form = ProfileUpdateForm(instance=profile, data=request.POST, files=request.FILES)
        if update_form.is_valid():
            update_form.save()
            return HttpResponseRedirect(reverse('dating_app:profile', args=[profile.id]))

    context = {'profile' : profile, 'update_form' : update_form}
    return render(request, 'dating_app/update.html', context)

"""Checks to see if the current user is also the profile owner"""
def check_profile_owner(user):

     if owner != user:
        raise Http404 

settings.py

#For Custom Model 
AUTH_USER_MODEL = 'dating_app.Profile'
Jake

필요한 것보다 훨씬 더 많은 일을 한 것 같습니다. Django 사용자 모델 (ALLAUTH를 사용하는지에 따라 다양한 형태)에는 프로필을 제외하고 필요한 거의 모든 것이 포함됩니다. 내 제한된 경험에서 가장 쉬운 방법은 사용자 모델에서 사용자 지정 사용자를 하위 클래스로 만드는 것입니다.

class CustomUser(AbstractUser):
   pass

새 필드를 추가하지 않으면 필요하지 않을 수 있지만 향후 확장 성을 높일 수 있습니다. 그런 다음 CustomerUser에 대한 foreignkey 링크가있는 Profile 클래스를 작성하십시오. 이 프로필에는 사진, 약력, 선호 사항 등 원하는 모든 것을 넣을 수 있습니다.

class Profile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    biography = models.TextField(max_length=255, default='', null=True, blank=True)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics/%Y/%m/%d')
    nativelanguage = models.ManyToManyField(Language, related_name='user_native_language')
    likedobjects = models.ManyToManyField(LearningObject, related_name='liked_objects')
    savedobjects = models.ManyToManyField(LearningObject, related_name='saved_objects')
    updated = models.DateTimeField(auto_now_add=True)

이것은 때때로 지루할 수 있지만 내장 Django 사용자 모델에서 코드를 분리하는 데 도움이됩니다.

올바른 사용자가 프로필을 변경하는지 확인하려면 request.user를 확인하고 해당 사용자의 프로필을 새 양식으로 가져 오는 것만 큼 쉬워야합니다. 사용자는 양식에 대한 액세스 또는 자신의 프로필 업데이트 허용 되어야 합니다. 다른 사용자의 프로필 업데이트를 위해 양식에 대한 다른 사용자 액세스를 허용해서는 안됩니다.

편집 : 사용자 지정 사용자 모델 (예 : "CustomUser")을 추가하는 한 가지 이점은 Django의 사용자 시스템을 엉망으로 만들지 않고 추가 메서드를 추가 할 수 있다는 것입니다. 예를 들어 어제이 코드를 찾았는데 누가 게시했는지 기억이 나지 않습니다.

from django.contrib.auth.models import AbstractUser, UserManager
class CustomUserManager(UserManager):
    def get_by_natural_key(self, username):
        return self.get(username__iexact=username)

class CustomUser(AbstractUser):
    objects = CustomUserManager()
    def add_email_address(self, request, new_email):
        # Add a new email address for the user, and send email confirmation.
        # Old email will remain the primary until the new one is confirmed.
        return EmailAddress.objects.add_email(request, self, new_email, confirm=True)

이것을 추가하면 사용자가 이메일 주소를 변경 한 다음 이전 주소를 완전히 제거하기 전에 이메일로 확인을 기다립니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관