Epo*_*pok 2 django django-admin
我是Python和Django的新手:)我需要一些帮助.
我想做的事:
我有一个模型页面,我需要在有人尝试更新一个对象时添加自定义字段"消息".
为什么?因为我正在建立一个修订系统.这个领域,它只是对变化的解释.所以这个字段没有链接到Page(但是链接到另一个模型PageRevision)
经过一些研究,我设法将此字段添加到admin.py文件中的表单,如下所示:
class PageAdminForm(forms.ModelForm):
# custom field not backed by database
message = forms.CharField(required=False)
class Meta:
model = Page
Run Code Online (Sandbox Code Playgroud)
它的工作,我的领域现在显示...但我不希望这个领域到处都是.就在有人试图更新Page对象时.我发现这个答案不同的字段为添加和更改页面在管理员,但它不适合我,因为它是一个自定义字段(我认为).
我在admin.py中的其余代码:
class PageAdmin(admin.ModelAdmin):
form = PageAdminForm
fields = ["title", "weight", "description", "message"]
list_display = ["title", "weight", "description"]
list_filter = ["updated_at"]
def get_form(self, request, obj=None, **kwargs):
if obj is None:
# not working ?
kwargs['exclude'] = ['message']
# else:
# kwargs['exclude'] = ['message']
return super(PageAdmin, self).get_form(request, obj, **kwargs)
def save_model(self, request, obj, form, change):
if not obj.id:
obj.author = request.user
obj.modified_by = request.user
wiki_page = obj.save()
# save page in revision table
revision = PageRevision(change=change, obj=wiki_page,
request=request)
# retrieve value in the custom field
revision.message = form.cleaned_data['message']
revision.save()
Run Code Online (Sandbox Code Playgroud)
def get_form不排除我的自定义消息字段,因为我认为它不知道是否存在.如果我把另一个像标题的字段,它的工作原理.那么如何从添加视图中排除自定义字段?
谢谢 :)
你是对的,它不会这样工作,因为'message'不是在Page模型上找到的字段,ModelAdmin类将忽略排除.您可以通过多种方式实现这一目标,但我认为最好的方法是:
class PageAdmin(admin.ModelAmin):
change_form = PageAdminForm
...
def get_form(self, request, obj=None, **kwargs):
if obj is not None:
kwargs['form'] = self.change_form
return super(UserAdmin, self).get_form(request, obj, **defaults)
Run Code Online (Sandbox Code Playgroud)
Basicaly这里django将在编辑页面时添加页面和自定义表单时使用自动生成的ModelForm.Django本身使用类似的技术在添加和更改用户时显示不同的表单:
https://github.com/django/django/blob/stable/1.6.x/django/contrib/auth/admin.py(有趣的部分在第68行)