3

나는 장고 & 파이썬에 대한 완벽한 n00b입니다. 나는 PHP 배경에서 왔기 때문에 당신은 그것에 대해 사과를 받아 들여야 할 것이다 : p.장고 인증 - 사용자 필드 추가 - 관리자 표시

다른 사람들에게 다양한 옵션을 표시하려면 장고에서 관리자 패널 기능을 사용하려고합니다.

시스템에서는 관리자가 "프로젝트"를 목록에 추가 할 수 있어야합니다. "개발자"는 할당 된 프로젝트 만 볼 수 있어야하며 특정 필드 만 변경할 수 있어야합니다.

1) 관리자 시스템으로 그것을하는 가장 좋은 방법 로그인하려면 "개발자"수 있습니다 :

그래서 질문은 두 배 추측?

1.a) 그렇다면 관리자의 사용자 양식에 표시 할 부울 필드를 얻으려면 어떻게해야합니까? 난 그냥 is_developer 플래그 싶어요. 나는 그것을 userProfile으로 추가했지만 양식에 표시하는 방법을 이해하지 못합니다.

2) 관리자 패널에 로그인하지 못하도록하고 (관리자 패널에) "frontend"를 허용해서 무엇을 볼 수 있어야합니까? 그들은 허용됩니까?

나는 의미가 있기를 바랍니다. 그것이 내가 익숙했던 것에 완전한 출발 인 것에 따라 나는 그 순간 도처에 작은 조각이다! 당신이 나를 제공 할 수있는 어떤 도움 사전에

감사합니다 :)

답변

5

가 여기에가는 많은, 그래서 내 대답을 조금씩거야.

"개발자"가 관리 시스템에 로그인하는 것이 가장 좋은 방법입니까?

이는 설정에 따라 다릅니다. 일반적으로 관리자는 "직원"만 사용할 수 있어야합니다. 즉, 귀하의 조직에 고용되어 있거나 직접 관련되어있는 사람들. 실제로 관리자에게 로그인하려면 사용자는 is_staff=True이어야합니다. 모든 사용자가 조직에 속한 경우 (결과적으로 "신뢰할 수있는 사용자"로 간주 될 수 있음) 그렇다면 모든 사용자가 관리자에게 액세스 할 수 있도록 허용하는 것이 좋습니다. 그렇지 않으면 보안 위험에 노출되는 것처럼 좋은 생각이 아닙니다.

그렇다면 관리자의 사용자 양식에 표시 할 부울 필드를 어떻게 가져 옵니까?

가장 단순한 의미에서 필드의 필드를 모델의 필드에 미리 채우는 ModelForm 인 경우에도 양식 클래스에 문자를 추가하여 양식에 필드를 추가 할 수 있습니다. 그 필드에 제공되지 않도록 내가 USERPROFILE로 추가했지만이 형태

UserProfile에 표시하는 방법을 이해하지

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    is_developer = forms.BooleanField(default=False) 

는 분명히 다른 모델입니다 User에 대한 양식. 그러나 Django는 다른 모델의 편집 양식을 사용하여 관련 모델을 추가/편집 할 수있는 기능을 제공합니다. 이 작업은 인라인 서식 세트를 통해 수행됩니다. 관리자의 경우 "인라인"이라고합니다.

class UserProfileInlineAdmin(admin.StackedInline): 
    model = UserProfile 
    max_num = 1 
    can_delete = False 

class UserAdmin(admin.ModelAdmin): 
    inlines = [UserProfileInlineAdmin] 

당신이 인라인 관리자에서 얻을보기는하지만, (이 경우 User의)를 기본 폼에서 명확하게 구별된다.내 뜻을 알기 위해 그것을 시험해 볼 수 있습니다. 그것은 끔찍한 것이 아니지만, 여전히 형태의 눈에 띄는 휴식입니다. 이전에 양식에 필드를 추가하는 방법에 대해 언급 한 이유는 원하는 경우 영리한 오분 향이있는 양식 하나처럼 보이게 만들 수 있기 때문입니다. 단순한 예를 들어,하지만 아이디어는 양식에 수동으로 필드 (들)을 추가 한 다음 기본 개체가 저장 편집중인 경우 실제로 수동으로 다른 개체를 업데이트하는 데 사용할 것입니다

class UserAdminForm(forms.ModelForm): 
    class Meta: 
     model = User 

    is_developer = forms.BooleanField(default=False) 

    def save(self, commit=True): 
     user = super(UserAdminForm, self).save(commit=commit) 
     if user.pk: 
      profile = user.get_profile() 
      profile.is_developer = self.cleaned_data.get('is_developer') 
      profile.save() 

.

의주의 사항은 여기 User 상대하고 있기 때문에, 훨씬 더 끈적 사항이있다, 지금 User

관련. 첫째, User은 이미 UserAdmin과 그 자체의 양식을 가지고 있습니다 (예 : 복수형). 새로운 기능을 추가하려면 기존 Django 기능을 프로세스에 유지해야합니다.

from django.contrib.auth.admin import UserAdmin 
form django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm, UserChangeForm 

class CustomUserCreationForm(UserCreationForm): 
    # do stuff 

class CustomUserChangeForm(UserChangeForm): 
    # do stuff 

class CustomUserAdmin(UserAdmin): 
    form = CustomUserChangeForm 
    add_form = CustomUserCreationForm 

admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 

또한 UserAdmin에는 고유 한 필드 세트 집합이 정의되어 있습니다. 기본값은 다음과 같습니다 당신은 필드 나 필드를 추가하려면

fieldsets = (
    (None, {'fields': ('username', 'password')}), 
    (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
    (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}), 
    (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 
    (_('Groups'), {'fields': ('groups',)}), 
) 
add_fieldsets = (
    (None, { 
     'classes': ('wide',), 
     'fields': ('username', 'password1', 'password2')} 
    ), 
) 

, 당신은 당신이 원하는 위치에 추가하여 필드 두 속성을 재정의해야합니다.

+0

매우 자세한 답장을 보내 주셔서 감사합니다. 당신이 설명하는 방법을 사용하여 작동하는 userprofile 필드가 있는데, 그것은 매우 잘 작동합니다. 언어를 너무 많이 통제 할 수 있게끔 때때로 약간 당황 스럽습니다. 실제로 익숙하지 않은 약간의 손이 닿지 만 분명히 이점을 볼 수 있습니다. 다시 감사합니다! :) – Xenocide

+0

메모 : 2 행에 오타가 있어야하며 '형식이 아님'이어야합니다. – Tom