2016-11-15 7 views
2

モデルのonetonefieldを使ってdjangoユーザー認証を拡張しようとしています。モデルは次のとおりです。ModelAdminのカスタムフィールドに初期値を割り当てる方法は?

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 

基本的な管理パネルでは、まずユーザーインスタンスを作成してからプロファイルを作成します。しかし、私はので、私は1 form.Thisにそれを作成することができ、管理パネルにカスタムフォームを使用するには、フォームが見ている:

Profile add form

これは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です

これですべてのプロファイルインスタンスを作成できます。しかし、プロファイルを変更/編集しようとすると、ユーザー名とパスワードのフィールドの初期値が表示されませんでした。

empty username and password field

あなたの助け

答えて

3

ためのおかげで、これを試してみてください。

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 
+0

それは、 return profileadminには属性userはありません。 –

+0

oops:the_user = User.objects.filter(pk = Profile.user.pk) –

+1

form.fieldsはProfileFormが属性フィールドを持たないという属性エラーを発生させます。 form.base_fieldsは私のために働きます。ありがとうございました –

関連する問題