29

フォームが表示される前に、Django モデル インスタンスを追加するために自動生成されたフォームのフィールドの初期値を設定するにはどうすればよいですか? Django 1.3.1 を使用しています。

私のモデルは次のとおりです。

class Foo(models.Model):
  title = models.CharField(max_length=50)
  description = models.TextField()

現在の管理フォームは特別なものではありません

class FooAdmin(admin.ModelAdmin):
  ordering = ('title',)

管理ページを使用して Foo の新しいインスタンスを追加すると、タイトルと説明用のフィールドが空の素敵なフォームが表示されます。私が望むのは、関数を呼び出して取得したテンプレートで説明フィールドを設定することです。

そこに到達するための私の現在の最善の試みはこれです:

def get_default_content():
  return 'this is a template for a Foo description'

class FooAdminForm(django.forms.ModelForm):

  class Meta:
      model = Foo

  def __init__(self, *args, **kwargs):
      kwargs['initial'].update({'description': get_default_content()})
      super(FooAdminForm, self).__init__(self, *args, **kwargs)

class FooAdmin(admin.ModelAdmin):
  ordering = ('title',)
  form = FooAdminForm

しかし、これを試してみると、次の Django エラーが発生します。

AttributeError at /admin/bar/foo/add/ 
   'FooForm' object has no attribute 'get'
Request Method: GET
Request URL:    http://localhost:8000/admin/bar/foo/add/
Django Version: 1.3.1
Exception Type: AttributeError
Exception Value:    'FooForm' object has no attribute 'get'
Exception Location: /www/django-site/venv/lib/python2.6/site-packages/django/forms/widgets.py in value_from_datadict, line 178

ここで何が問題なのか、それを機能させるために何をすべきかわかりません。このエラーについて私が奇妙に感じているのは (まったく表示されないという事実を除けば)、私のコードには FooForm がまったくないということですか?

4

4 に答える 4

37

Alasdair のアプローチは素晴らしいですが、時代遅れです。Radev のアプローチは非常に素晴らしく、コメントで述べたように、ドキュメントにはこれについて何も記載されていないことに驚きました。

それらとは別に、Django 1.7以降、初期フォーム値を設定する関数get_changeform_initial_dataがあります:ModelAdmin

def get_changeform_initial_data(self, request):
    return {'name': 'custom_initial_value'}
于 2015-11-11T10:37:14.877 に答える
26

selfメソッド定義の最初の引数として含める必要があり__init__ますが、スーパークラスのメソッドを呼び出すときは含めないでください。

def __init__(self, *args, **kwargs):
    # We can't assume that kwargs['initial'] exists! 
    if 'initial' not in kwargs:
        kwargs['initial'] = {}
    kwargs['initial'].update({'description': get_default_content()})
    super(FooAdminForm, self).__init__(*args, **kwargs)

そうは言っても、モデル フィールドはdefaultの callable を取ることができるため、カスタム管理フォームをまったく定義する必要がない場合があります。

class Foo(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField(default=get_default_content)
于 2012-04-03T21:16:06.913 に答える