我是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
它的工作,我的领域现在显示...但我不希望这个领域到处都是.就在有人试图更新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()
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)
Basicaly这里django将在编辑页面时添加页面和自定义表单时使用自动生成的ModelForm.Django本身使用类似的技术在添加和更改用户时显示不同的表单:
https://github.com/django/django/blob/stable/1.6.x/django/contrib/auth/admin.py(有趣的部分在第68行)