모델의 onetonefield를 통해 django 사용자 인증을 확장하려고합니다. 모델은 다음과 같습니다.
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
nim = models.CharField(max_length=10, blank=True)
def __str__(self):
return self.user.username
기본 관리자 패널을 사용하여 먼저 사용자 인스턴스를 만든 다음 프로필을 만듭니다. 하지만 관리 패널에서 사용자 지정 양식을 사용하므로 하나의 양식에서 만들 수 있습니다.
이것은 forms.py입니다.
from django import forms
from django.contrib.auth.models import User
from .models import Profile
class ProfileForm(forms.ModelForm):
username = forms.CharField(required=False, max_length=150)
password = forms.CharField(required=False, max_length=50, widget=forms.PasswordInput)
class Meta:
model = Profile
fields = ('username', 'password', 'nim')
그리고 이것은 admin.py입니다.
from django.contrib import admin
from django.contrib.auth.models import User
from .forms import ProfileForm
from .models import Profile
class ProfileAdmin(admin.ModelAdmin):
form = ProfileForm
def save_model(self, request, obj, form, change):
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = User.objects.create_user(username=username, password=password)
user.save()
obj.user = user
obj.save()
admin.site.register(Profile, ProfileAdmin)
이것으로 프로필 인스턴스를 잘 만들 수 있습니다. 그러나 프로필을 변경 / 편집하려고 할 때 사용자 이름 및 암호 필드에 대한 초기 값이 표시되지 않고 nim 필드 만 표시되었습니다.
당신의 도움을 주셔서 감사합니다
이 시도:
class ProfileAdmin(admin.ModelAdmin):
form = ProfileForm
# ...
def get_form(self, request, obj=None, *args, **kwargs):
form = super(ProfileAdmin, self).get_form(request, *args, **kwargs)
#find the user via user profile forien key
the_user = User.objects.filter(pk=Profile.user.pk)
# Initial values
form.base_fields['username '].initial = the_user.username
return form
또한 이것을 시도하고 차이점을보십시오 : (필드는 슈퍼 호출 후에 만 살아 있습니다)
form.fields['username '].initial = the_user.username
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다