【问题标题】:Django Admin- Limiting ForeignKey Field's choicesDjango Admin-限制外键字段的选择
【发布时间】:2017-05-17 23:09:18
【问题描述】:

我一直在从事我的 Django 项目。 我使用自定义表单(一个名为 Form 的类),并且我有一个名为 Restricted_Form 的类。此类的重点是管理员用户(“员工身份”用户“)可以选择限制哪些用户或组可以访问表单/提交填写的表单:

#....models.py:
from django.contrib.auth.models import User, Group

class Restricted_Form(models.Model):
    Form = models.ForeignKey('forms.Form')
    Authorized_Users = models.ManyToManyField(User, blank=True)
    Authorized_Groups = models.ManyToManyField(Group, blank=True)
    user = models.ForeignKey(User, blank=True, null=True, related_name="restriction_owner")

“表格”本身有:

user = models.ForeignKey(User, blank=True, null=True)
#this is always the user who created it

我的问题是限制非超级用户管理员可以做什么。他们应该只能创建 Restricted_Form 对象,包括他们自己创建的 Form。实际上,当他们创建 Restricted_Form 时,只有他们自己创建的“表单”才应作为选项显示在下拉菜单中。 这是我现在相关的管理类:

#...admin.py
class RestrictedFormAdmin(admin.ModelAdmin): 
    fieldsets = [
    (None, {"fields": ("Form", "Authorized_Users", "Authorized_Groups")}),]
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'user', None) is None:  
            obj.user = request.user
        obj.save()
    def get_queryset(self, request):
        qs = super(RestrictedFormAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=request.user)
    def has_change_permission(self, request, obj=None):
        if not obj:
            return True 
        return obj.user == request.user or request.user.is_superuser

admin.site.register(Restricted_Form, RestrictedFormAdmin)

我们将不胜感激。

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    你可以试试这样的:

    class RestrictedFormAdmin(admin.ModelAdmin):
        def render_change_form(self, request, context, *args, **kwargs):
            context['adminform'].form.fields['Form'].queryset = Form.objects.filter(user=request.user)
            return super(RestrictedFormAdmin, self).render_change_form(request, context, args, kwargs)         
    

    【讨论】:

    • 同时我一直在努力让它工作,用 forms.ModelForm 创建一个单独的类并在那里使用 filter() ,但这更干净而且它有效!非常感谢:)
    猜你喜欢
    • 2016-08-01
    • 2011-03-14
    • 2010-12-16
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多