gpt4 book ai didi

django - 如何为 Django 管理模型添加实例表单设置初始数据?

转载 作者:行者123 更新时间:2023-12-03 12:24:31 25 4
gpt4 key购买 nike

在显示表单之前,如何在自动生成的表单中设置字段的初始值以添加 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 ?

最佳答案

您需要包含 self作为您 __init__ 中的第一个参数方法定义,但在调用父类(super class)的方法时不应包含它。

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 调用可调用对象。 ,因此您可能根本不必定义自定义管理表单。
class Foo(models.Model):
title = models.CharField(max_length=50)
description = models.TextField(default=get_default_content)

关于django - 如何为 Django 管理模型添加实例表单设置初始数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com