django admin - 添加不属于模型的自定义表单字段

时间:2013-07-30 13:12:16

标签: django admin

我在管理站点注册了一个模型。其中一个字段是长字符串表达式。我想在管理员的基于这些字段值的管理员的添加/更新页面中添加自定义表单字段,我将构建长字符串表达式并将其保存在相关的模型字段中。

我该怎么做?

更新: 基本上我正在做的是从符号构建数学或字符串表达式,用户选择符号(这些是不属于模型的自定义字段),当他点击保存时,我从列表中创建一个字符串表达式表示符号并将其存储在DB中。我不希望符号是模型和DB的一部分,只是最终表达式。

5 个答案:

答案 0 :(得分:137)

在您的admin.py或单独的forms.py中,您可以添加一个ModelForm类,然后像往常一样在其中声明您的额外字段。我还举了一个例子,说明如何在form.save()中使用这些值:

from django import forms
from yourapp.models import YourModel


class YourModelForm(forms.ModelForm):

    extra_field = forms.CharField()

    def save(self, commit=True):
        extra_field = self.cleaned_data.get('extra_field', None)
        # ...do something with extra_field here...
        return super(YourModelForm, self).save(commit=commit)

    class Meta:
        model = YourModel

要让额外的字段显示在管理员中:

  1. 编辑您的admin.py并设置表单属性以引用您在上面创建的表单
  2. 在您的字段或字段集声明中包含您的新字段
  3. 像这样:

    class YourModelAdmin(admin.ModelAdmin):
    
        form = YourModelForm
    
        fieldsets = (
            (None, {
                'fields': ('name', 'description', 'extra_field',),
            }),
        )
    

    更新: 在django 1.8中,您需要将fields = '__all__'添加到YourModelForm的元类中。

答案 1 :(得分:28)

它可以在管理员中完成,但是没有一种非常简单的方法。另外,我想建议将大多数业务逻辑保留在模型中,这样您就不会依赖Django Admin。

如果你的模型上有两个单独的字段,也许会更容易(甚至可能更好)。然后在模型上添加一个组合它们的方法。

例如:

class MyModel(models.model):

    field1 = models.CharField(max_length=10)
    field2 = models.CharField(max_length=10)

    def combined_fields(self):
        return '{} {}'.format(self.field1, self.field2)

然后在管理员中,您可以将combined_fields()添加为只读字段:

class MyModelAdmin(models.ModelAdmin):

    list_display = ('field1', 'field2', 'combined_fields')
    readonly_fields = ('combined_fields',)

    def combined_fields(self, obj):
        return obj.combined_fields()

如果要将combined_fields存储在数据库中,您还可以在保存模型时保存它:

def save(self, *args, **kwargs):
    self.field3 = self.combined_fields()
    super(MyModel, self).save(*args, **kwargs)

答案 2 :(得分:4)

您可以随时创建新的管理模板,并在admin_view中执行您需要的操作(覆盖管理员添加网址到您的admin_view):

 url(r'^admin/mymodel/mymodel/add/$' , 'admin_views.add_my_special_model')

答案 3 :(得分:3)

如果您只想在模型上存储组合字段而不是两个单独的字段,则可以执行以下操作:

我从来没有这样做过,所以我不能完全确定它会如何发挥作用。

答案 4 :(得分:2)

Django 2.1.1 主要答案使我无法回答问题。它并没有帮助我将结果保存到实际模型中的字段中。在我的情况下,我希望用户可以在其中输入数据的文本字段,然后在进行保存时处理数据,并将结果放入模型的字段中并保存。虽然原始答案显示了如何从额外字段中获取值,但至少没有在Django 2.1.1中显示如何将其保存回模型中。

这将从未绑定的自定义字段中获取值,进行处理,并将其保存到我的真实描述字段中:

error_log = /home/[[user]]/html/php_error.log