在Django管理后台中覆盖一个表单

52
在Django admin中,我想要覆盖并实现我的模型表单(例如发票模型)的自定义表单。我希望发票表单具有客户名称、产品名称的自动填充字段,并且我还想进行自定义验证(例如对于客户的信用限制)。如何覆盖Django admin提供的默认表单并实现自己的表单?我是Django的新手,非常感谢任何指导。
2个回答

68
您可以通过将ModelAdmin的form属性设置为自己的表单类,来覆盖Django内置管理界面的表单。请参阅:
  1. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form
  2. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin
您还可以覆盖表单模板-请查看https://docs.djangoproject.com/en/dev/ref/contrib/admin/#custom-template-options。 如果您特别需要自动完成功能,我可以推荐https://github.com/crucialfelix/django-ajax-selects

是否可以覆盖表单的外观?同时为选定字段提供自动完成功能。 - 18bytes
如果你正在寻找管理自动完成,我没有使用django-ajax-selects,但是django-autocomplete-light绝对值得一试 :) - GabLeRoux

36

如何按照文档在Django管理员中覆盖表单:

from django import forms
from django.contrib import admin
from myapp.models import Person

class PersonForm(forms.ModelForm):

    class Meta:
        model = Person
        exclude = ['name']

class PersonAdmin(admin.ModelAdmin):
    exclude = ['age']
    form = PersonForm

2
我应该把这段代码放在models.py还是admin.py中?另外,Person app是什么意思?它是指我创建的一个app吗? - Kehlin Swain
1
@KehlinSwain:人是模型。这段代码可以存在于admin.py中,或者是一个外部的form.py文件,你可以从admin.py中导入它。 - dan-klasson
@AlMahdi 如果 add_formadmin.ModelAdmin 类中的一个方法,那么我不明白为什么不行。 - dan-klasson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接