【问题标题】:How to give users authorisation to access specific fields/objects of the Model Form at /admin in django? Display particular fields in the html page如何授权用户在 django 的 /admin 中访问模型表单的特定字段/对象?在 html 页面中显示特定字段
【发布时间】:2019-01-27 06:57:39
【问题描述】:

models.py

from django.db import models
from django.contrib.auth.models import User

CHOICES = (('1','Earned Leave'),('2','Casual Leave'),('3','Sick Leave'),('4','Paid Leave'))

class Leave(models.Model):

    name = models.CharField(max_length = 50)
    user = models.ForeignKey(User, on_delete = models.CASCADE, null =True)
    employee_ID = models.CharField(max_length = 20)
    department = models.CharField(max_length = 50)
    designation = models.CharField(max_length = 50)
    type_of_leave = models.CharField(max_length = 15, choices = CHOICES, default = None)
    from_date = models.DateField(help_text = 'mm/dd/yy')
    to_date = models.DateField(help_text = 'mm/dd/yy')
    reporting_manager = models.CharField(max_length = 50, default = None, help_text = '0001_manager, 0002_manager')
    reason = models.CharField(max_length= 180)
    accepted = models.BooleanField(('approval status'), default= False)


    def __str__(self):
        return self.name

我希望用户只在提交表单后访问“type_leave_field”,当他被赋予“是员工”状态时。

forms.py

from django import forms
from lrequests import models

class LeaveRequestForm(forms.ModelForm): 

    class Meta:
         fields = ("name", "employee_ID", "department", "designation", "type_of_leave", "from_date", "to_date", "reporting_manager", "reason")
    model = models.Leave

views.py

from django.shortcuts import render
from django.http import HttpResponse
from .forms import LeaveRequestForm

from .models import Leave

def leaveRequest(request):
    form_class = LeaveRequestForm
    if request.method == "POST":
        form = LeaveRequestForm(request.POST)
        if form.is_valid():
            leave = form.save(commit = False)
            leave.user = request.user
            form.save()
        return HttpResponse("Sucessfully submitted")
    else:
        form = LeaveRequestForm()
        return render(request, "request_form.html", {'form' : form_class})

我尝试过使用 django-guardian 和 django-objectpermissions,但我还没有看到使用它们的确切方法。我什至为它创建了一个用户权限,但由于管理视图和模板不是用户编写的代码,我无法给出定义。

base : 这是一个休假管理系统项目,用户可以在提交表单后编辑他的休假类型,谢谢。

更新-

如何在 html 页面中显示特定字段。

从我的 models.py 中,'accepted' 字段是一个布尔字段,在用户提交表单后,我想在 html 页面中显示该字段的状态,无论是 True 还是 False。我无法从数据库中检索该字段..

【问题讨论】:

    标签: python django database


    【解决方案1】:

    您可以做的是覆盖 ModelAdmin readonly_fields 方法,将除用户应该能够更新的字段之外的所有其他字段设为只读。

    def get_readonly_fields(self, request, obj=None):
        # the logged in user can be accessed through the request object 
        if obj and request.user.is_staff:
            readonly_fields = [f.name for f in self.opts.fields]
            readonly_fields.remove('type_leave_field')
            return readonly_fields
    

    关于列表理解:

    self.opts 让您可以访问 Meta 类中指定的模型(或者 @admin.register() 也应该没问题)。

    self.opts.fields 是一个由该模型中的字段对象组成的元组。每个对象都是一个包含字段元数据的字典。通过访问每个字段对象的 .name(键),我们可以得到表示为字符串的字段名称。

    【讨论】:

    • 感谢它的魅力,但请您详细解释一下您使用的列表理解(self.opt.field 和 f.name)
    • 我已经更新了答案,希望这能更清楚地说明问题。
    • 你能对我更新的问题给出一个想法吗?是的,这个解释对我有帮助,谢谢。
    • 我不完全确定用户的html页面是什么意思?
    • 我只想在 HTML 页面中显示它(字段的状态)。
    猜你喜欢
    • 2012-06-23
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多