我无法弄清楚如何在django admin中删除表单字段

时间:2014-04-05 10:51:34

标签: django django-admin

我想实现以下目标:

如果用户是管理员,请允许他们从用户下拉列表中选择博客作者。如果不是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)

1 个答案:

答案 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

未经测试。但我希望它对你有所帮助。 :)