我想实现以下目标:
如果用户是管理员,请允许他们从用户下拉列表中选择博客作者。如果不是admin,请从admin中完全删除作者字段。我所使用的代码是,它从admin中删除了该字段,但它不允许非管理员用户保存表单,因为可能是作者字段存在并且需要设置为某个值,即它们会为作者收到错误实际上不在页面上的字段。
我已尝试过多种变体,包括2个表单,一个没有作者字段,另一个有它(由于某种原因,这似乎打破了发布的日期)而且我的想法已经用完如何做这个。在SO和其他地方有很多例子,但要么它们不适合我的用例,要么看起来不起作用(使用django 1.6)。
有什么想法吗?
#forms.py
class BlogForm(forms.ModelForm):
author = forms.ModelChoiceField( queryset=User.objects.filter( Q(is_staff=True) ))
class Meta:
model = Blog
#admin.py
class BlogAdmin(AdminPlus):
form = BlogForm
default_fieldset = [( 'Publishing', {'fields': ['pub_date','is_published']} )]
admin_fieldset = [( 'Publishing', {'fields': ['pub_date', 'author','is_published']} )]
def get_form(self, request, obj=None, **kwargs):
current_user = request.user
if not request.user.is_superuser:
self.exclude = ('author',)
form = super(BlogAdmin, self).get_form(request, obj, **kwargs)
form.current_user = current_user
return form
def get_fieldsets(self, request, obj=None):
if not request.user.is_superuser:
return self.default_fieldset
return self.admin_fieldset
admin.site.register(Blog, BlogAdmin)
答案 0 :(得分:0)
在class BlogForm(forms.ModelForm)
中添加以下内容:
def clean_author(self):
author = self.cleaned_data['author']
## remove below 'if else' if u don't want to perform any validation.
if self.current_user.is_superuser:
## perform superuser validation if you want otherwise simply pass
pass
else:
## perform non-superuser validation if you want otherwise simply pass
pass
return author
未经测试。但我希望它对你有所帮助。 :)