Django:如何从特定用户的管理表单中删除字段? [英] Django: How to remove fields from the admin form for specific users?
问题描述
我的管理员看起来像这样(没有排除变量):
My admin looks like this (with no exclude variable):
class MovieAdmin(models.ModelAdmin)
fields = ('name', 'slug', 'imdb_link', 'start', 'finish', 'added_by')
list_display = ('name', 'finish', 'added_by')
list_filter = ('finish',)
ordering = ('-finish',)
prepopulated_fields = {'slug': ('name',)}
form = MovieAdminForm
def get_form(self, request, obj=None, **kwargs):
form = super(MovieAdmin, self).get_form(request, obj, **kwargs)
form.current_user = request.user
return form
admin.site.register(Movie, MovieAdmin)
表单:
class MovieAdminForm(forms.ModelForm):
class Meta:
model = Movie
def save(self, commit=False):
instance = super(MovieAdminForm, self).save(commit=commit)
if not instance.pk and not self.current_user.is_superuser:
if not self.current_user.profile.is_manager:
instance.added_by = self.current_user.profile
instance.save()
return instance
我正在尝试删除added_by字段用户,因为我更喜欢从会话填充。我尝试过以下方法:
I'm trying to remove the added_by field for users since I'd prefer to populate that from the session. I've tried methods from the following:
- Django admin - 删除字段如果编辑对象
- 从ModelForm中删除字段
- http://www.mdgart.com/2010/04/08/django-admin-how-to-hide-fields-in-a-form-for-certain-users-that-are-not-superusers /
- Django admin - remove field if editing an object
- Remove fields from ModelForm
- http://www.mdgart.com/2010/04/08/django-admin-how-to-hide-fields-in-a-form-for-certain-users-that-are-not-superusers/
然而,每一个我都会得到: KeyError while rendering:Key'added_by'not在表单
中找到。看来我需要在表单渲染过程中先删除该字段,但是我坚持在哪里做。
However with each one I get: KeyError while rendering: Key 'added_by' not found in Form
. It seems I need to remove the field earlier in the form rendering process but I'm stuck on where to do this.
那么我该如何排除 added_by
字段为正常用户?
So how can I exclude the added_by
field for normal users?
推荐答案
当你的list_display是评估。您不能显示被排除的字段。删除的added_by的版本也需要相应的list_display。
You're probably getting that error when list_display is evaluated. You can't show a field that's excluded. The version with added_by removed also needs a corresponding list_display.
def get_form(self, request, obj=None, **kwargs):
current_user = request.user
if not current_user.profile.is_manager:
self.exclude = ('added_by',)
self.list_display = ('name', 'finish')
form = super(MovieAdmin, self).get_form(request, obj, **kwargs)
form.current_user = current_user
return form
这篇关于Django:如何从特定用户的管理表单中删除字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!