2017-04-11 6 views
0

私は何も変更しなくても、インラインadminのキーを投げてformfield_for_choice_fieldを無効にしますか?formfield_for_choice_fieldのキーエラーを無効にする

ProfileInline:

class ProfileInline(admin.StackedInline): 
    model = Profile 
    can_delete = False 
    classes = ['collapse', ] 
    form = ProfileForm 
    readonly_fields = ('thumbnail_img',) 
    extra = 1 
    max_num = 1 
    min_num = 1 
    fieldsets = (
     (None, { 
      'fields': (
       'thumbnail_img', 'avatar', 'nickname', 'gender', 
       'phone_number', 'birth_place', 'birth_date', 'angkatan', 
       'year_registered', 'year_graduation', 'religion', 'jobs' 
      ) 
     }), 
     ('Alamat saat sekolah di sman 3 Padang', { 
      'fields': ('old_address',) 
     }), 
     ('Alamat sekarang', { 
      'fields': ('curr_country', 'curr_province', 
        'curr_city', 'curr_street') 
     }), 
     ('Media Sosial', { 
      'fields': ('link_facebook', 'link_twitter', 'link_instagram', 
        'link_whatsup', 'link_bbm') 
     }), 
     ('Sembunyikan Data Pribadi', { 
      'fields': ('show_phone', 'show_curr_address', 'show_jobs', 
        'show_social_link', 'show_family') 
     }) 
    ) 

    def formfield_for_choice_field(self, db_field, request, **kwargs): 
     super(ProfileInline, self).formfield_for_choice_field(db_field, request, **kwargs) 

キーエラー:

enter image description here

トレースバック:

Internal Server Error: /admin/accounts/alumni/add/ 
Traceback (most recent call last): 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\forms\forms.py", line 144, in __getitem__ 
    field = self.fields[name] 
KeyError: 'gender' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\core\handlers\exception.py", line 42, in inner 
    response = get_response(request) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\core\handlers\base.py", line 217, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\core\handlers\base.py", line 215, in _get_response 
    response = response.render() 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\response.py", line 109, in render 
    self.content = self.rendered_content 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\response.py", line 86, in rendered_content 
    content = template.render(context, self._request) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\backends\django.py", line 66, in render 
    return self.template.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 208, in render 
    return self._render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\loader_tags.py", line 174, in render 
    return compiled_parent._render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\loader_tags.py", line 174, in render 
    return compiled_parent._render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\loader_tags.py", line 70, in render 
    result = block.nodelist.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\loader_tags.py", line 70, in render 
    result = block.nodelist.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\defaulttags.py", line 209, in render 
    nodelist.append(node.render_annotated(context)) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\loader_tags.py", line 210, in render 
    return template.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 210, in render 
    return self._render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\defaulttags.py", line 209, in render 
    nodelist.append(node.render_annotated(context)) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\defaulttags.py", line 209, in render 
    nodelist.append(node.render_annotated(context)) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\loader_tags.py", line 210, in render 
    return template.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 210, in render 
    return self._render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\defaulttags.py", line 209, in render 
    nodelist.append(node.render_annotated(context)) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\template\defaulttags.py", line 165, in render 
    values = list(values) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\contrib\admin\helpers.py", line 115, in __iter__ 
    yield AdminField(self.form, field, is_first=(i == 0)) 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\contrib\admin\helpers.py", line 127, in __init__ 
    self.field = form[field] # A django.forms.BoundField instance 
    File "C:\Users\afdallismen\Envs\ikasmantri\lib\site-packages\django\forms\forms.py", line 150, in __getitem__ 
    ', '.join(sorted(f for f in self.fields)), 
KeyError: "Key 'gender' not found in 'ProfileForm'. Choices are: avatar, birth_date, birth_place, curr_city, curr_country, curr_province, curr_street, id, jobs, link_bbm, link_facebook, link_instagram, link_twitter, link_whatsup, nickname, 
old_address, phone_number, show_curr_address, show_family, show_jobs, show_phone, show_social_link, user." 
[11/Apr/2017 23:52:29] "GET /admin/accounts/alumni/add/ HTTP/1.1" 500 381609 

ProfileForm:

class ProfileForm(forms.ModelForm): 
    curr_street = Address._meta.get_field('street').formfield() 
    curr_city = Address._meta.get_field('city').formfield() 
    curr_province = Address._meta.get_field('province').formfield() 
    curr_country = Address._meta.get_field('country').formfield() 

    class Meta: 
     model = Profile 
     fields = '__all__' 

    def __init__(self, *args, **kwargs): 
     super(ProfileForm, self).__init__(*args, **kwargs) 
     self.fields['birth_date'].input_formats = settings.DATE_INPUT_FORMATS 
     if self.instance.pk is not None: 
      self.fields['curr_street'].initial = self.instance.address.street 
      self.fields['curr_city'].initial = self.instance.address.city 
      self.fields[ 
       'curr_province'].initial = self.instance.address.province 
      self.fields['curr_country'].initial = self.instance.address.country 
     self.helper = FormHelper() 
     self.helper.form_tag = False 

フィールドセットをインラインから削除しようとしましたが、エラーは発生しません。フィールドセットが原因ですか?

トレースバックを振り返ると、見つからなかったキーは選択肢を使用しているフィールドであることがわかりました。

class Profile(models.Model): 
    GENDER_CHOICES = choices.GENDER_CHOICES 
    RELIGION_CHOICES = choices.RELIGION_CHOICES 
    ANGKATAN_CHOICES = choices.ANGKATAN_CHOICES 
    YEAR_REGISTERED_CHOICES = choices.YEAR_REGISTERED_CHOICES 
    YEAR_GRADUATION_CHOICES = choices.YEAR_GRADUATION_CHOICES 

    gender = models.CharField(
     verbose_name="jenis kelamin", 
     max_length=1, 
     choices=GENDER_CHOICES 
    ) 
    angkatan = models.PositiveIntegerField(
     verbose_name="angkatan", 
     choices=ANGKATAN_CHOICES, 
     help_text="Angkatan di Sman 3 Padang." 
    ) 
    year_registered = models.PositiveIntegerField(
     verbose_name="tahun masuk", 
     choices=YEAR_REGISTERED_CHOICES, 
     help_text="Tahun masuk di Sman 3 Padang." 
    ) 
    year_graduation = models.PositiveIntegerField(
     verbose_name="tahun lulus", 
     choices=YEAR_GRADUATION_CHOICES, 
     help_text="Tahun lulus dari Sman 3 Padang." 
    ) 
    religion = models.PositiveIntegerField(
     verbose_name="agama", 
     choices=RELIGION_CHOICES 
    ) 

これらの5つのフィールドがProfileFormで発見されていない。ここで

は私のモデルのサブセットです。

このためハックのが見つかりました並べ替え、formfield_for_choice_fieldでスーパーを呼び出し、django.contrib.admin.options.BaseModelAdminクラスで見つかったベースの実装を使用していないことによって:

def formfield_for_choice_field(self, db_field, request, **kwargs): 
    # super(ProfileInline, self).formfield_for_choice_field(db_field, request, **kwargs) 
    if db_field.name == "angkatan" and not request.user.is_superuser: 
     kwargs['choices'] = (
      (request.user.admin.angkatan, str(request.user.admin.angkatan)), 
     ) 

    # Base implementation bellow 
    if db_field.name in self.radio_fields: 
     # Avoid stomping on custom widget/choices arguments. 
     if 'widget' not in kwargs: 
      kwargs['widget'] = widgets.AdminRadioSelect(attrs={ 
       'class': get_ul_class(self.radio_fields[db_field.name]), 
      }) 
     if 'choices' not in kwargs: 
      kwargs['choices'] = db_field.get_choices(
       include_blank=db_field.blank, 
       blank_choice=[('', _('None'))] 
      ) 
    return db_field.formfield(**kwargs) 
+0

@Alasdairが私の質問を更新しました。 –

+0

'Profile'モデルの中に' gender'フィールドがありますか?これがエラーの原因です。 –

+0

はい、あります。 ProfileInlineからフィールドセットを削除すると修正されますが、フィールドセットを使用します。 –

答えて

1

formfield_for_choice_fieldオーバーライドが何かを返す必要があります。

def formfield_for_choice_field(self, db_field, request, **kwargs): 
    if db_field.name == "some_field": 
     # do stuff 
    return super(ProfileInline, self).formfield_for_choice_field(db_field, request, **kwargs) 

あなたべき意識し、またformfield_for_choice_field説明以下note:あなたはそれをこのように書く必要があります。詳細はhereで説明します。

+0

ワウ、その帰りのために6時間飛ぶ。本当にありがとう、私は今眠ることができます。 –

+0

これはプログラミングです...時にはそれは秒で動作します、それ以外の場合は多分1日中(!) –

関連する問題