2016-07-20 11 views
3

私のモデルの1つにデフォルト値のフィールドがありますが、管理者の中でそのデフォルト値を違えて欲しいです。ここではこれを達成するに私の試みです:Django管理者:インラインの初期値を無効にする

models.pyは

from django.db import models 


class Parent(models.Model): 
    parent_field_1 = models.CharField(max_length=255) 
    parent_field_2 = models.CharField(max_length=255, blank=True) 

    class Meta: 
     ordering = ('pk',) 

    def __unicode__(self): 
     return self.parent_field_1 


class Child(models.Model): 
    parent = models.ForeignKey(Parent) 
    child_field_1 = models.CharField(max_length=255) 
    child_field_2 = models.CharField(max_length=255, blank=True) 
    child_field_3 = models.IntegerField(default=0) 

    class Meta: 
     ordering = ('pk',) 
     verbose_name_plural = 'children' 

    def __unicode__(self): 
     return self.child_field_1 

forms.py

from django import forms 

from .models import Child 


class ChildForm(forms.ModelForm): 
    class Meta: 
     model = Child 
     fields = [ 
      'parent', 
      'child_field_1', 
      'child_field_2', 
      'child_field_3', 
     ] 

    def __init__(self, *args, **kwargs): 
     if 'instance' not in kwargs: 
      initial = kwargs.get('initial', {}) 
      initial['child_field_3'] = '1' 
      kwargs['initial'] = initial 

     super(ChildForm, self).__init__(*args, **kwargs) 

admin.py

from django.contrib import admin 

from .forms import ChildForm 
from .models import Parent, Child 


class ChildInline(admin.StackedInline): 
    model = Child 
    form = ChildForm 


class ParentAdmin(admin.ModelAdmin): 
    inlines = [ChildInline] 


class ChildAdmin(admin.ModelAdmin): 
    form = ChildForm 

admin.site.register(Parent, ParentAdmin) 
admin.site.register(Child, ChildAdmin) 

私は子を追加して行きます、 「子フィールド3」フィールドには、モデルのデフォルトである「0」の代わりに「1」が設定されています。子を編集する場合は、「子フィールド3」フィールドにデータベース内の値が入力されます。これも必要なものです。

私が実行している問題は、親を追加または編集するときに発生します。親を追加しようとすると、すべての子インラインフォームにも記入する必要があります。同様に、親を編集しようとすると、余分な子インラインフォームをすべて記入する必要があります。 ChildInlineクラス 'form = ChildForm行をコメントアウトすると、正しいの動作が得られますが、間違ったデフォルト値( "1"ではなく "0")が返されます。正しい動作と正しいデフォルト値を取得するにはどうすればよいですか?

答えて

2

あなたのフィールドはIntegerFieldです。 initialを整数に設定する必要があります。

フォームが空の場合(ここの場合)、full_cleandismissed if the form did not changeです。 has_changed()は、changed_dataの空白によって決まります。

field.has_changed(initial, data)フィールドの変更は、データがfield.to_python(value)に渡され、IntegerFieldの場合に整数を返します。一方、initialは正しいタイプのものとされ、提供されたままである。これにより、has_changed = ('1' != 1)が返され、Trueが返されますが、返されるのはFalseです。

+0

私のコードではなく、 'self.fields ['child_field_3']。initial = '1''を使っても違いはありませんでした。あなたのデバッグコードを使用して、次の3回出力されました: '(['child_field_3']、True)' – Nick

+0

私は問題を見つけました。 –

+0

うわー、それだった!ありがとう!私の論理はオンラインのどこかからコピー/ペーストとして始まりました。どういうわけか私は初期値は常に文字列であると考えられていたが、明らかにそうではないという考えがある。再度、感謝します! – Nick

関連する問題