Django admin 常用方法 model 增加只讀權限


1.Django admin model 設置查看權限

Django model 默認只有增加、刪除、修改權限。沒有查看權限

#model
class Ad_Campaing(models.Model):
    TEST_CHANNEL = (
        ('adx-1', '渠道1'),
        ('adx-2', '渠道2'),
        ('adx-3', '渠道3'),
        ('adx-4', '渠道4'),
        ('adx-5', '渠道5'),
        ('adx-no', '不測試')

    )
    AD_CAMPAING_STATUS = (
        ('dsh', '待審核'),
        ('tfz', '投放中'),
        ('zt', '暫停'),
        ('ygq', '已過期'),
        ('yebz', '余額不足'),
        ('bgdb', '曝光達標'),
        ('djdb', '點擊達標'),
        ('ready', '未到開始時間'),
        ('ysdb', '預算達標')
    )

    name = models.CharField(max_length=200, verbose_name="廣告組名稱", default="")
    status = models.CharField(max_length=20, verbose_name='廣告組狀態', default="dsh",
                              choices=AD_CAMPAING_STATUS)
    advertiser = models.ForeignKey(UserProfile, verbose_name='廣告主ID', null=True, blank=True)
    start_time = models.DateTimeField(verbose_name='開始時間', null=True, blank=True)
    end_time = models.DateTimeField(verbose_name='結束時間', null=True, blank=True)
    #
    budget = models.IntegerField(verbose_name='計划預算', null=False, blank=False, default=0)
    # pay
    max_impression = models.IntegerField(verbose_name='最大曝光數', null=True, blank=True)
    max_click = models.IntegerField(verbose_name='最大點擊數', null=True, blank=True)
    pay_money = models.IntegerField(verbose_name='消費金額', null=True, blank=True)
    # for free
    free_max_impression = models.IntegerField(verbose_name='贈送曝光數', null=False, blank=False, default=0)
    free_max_click = models.IntegerField(verbose_name='贈送點擊數', null=False, blank=False, default=0)

    # 不要物理性刪除數據, 如果要刪除某條數據,就將enable置為0
    enable = models.IntegerField(verbose_name='是否有效', null=False, blank=False, default=1)
    unit_price = models.FloatField(verbose_name='單價', default=0.5)
    weight = models.IntegerField(verbose_name='權重', default=50)
    permit_min_vername = models.CharField(max_length=20, verbose_name="最小app版本號", default="4.6.7")
    action = models.IntegerField(verbose_name='跳轉類型', default=1)
    permit_connect_type = models.CharField(max_length=20, verbose_name="允許跳轉類型", default="[1, 2, 3, 4, 5]")
    test_channel = models.CharField(max_length=20, verbose_name='測試渠道', default="adx-1",
                                    choices=TEST_CHANNEL)
    finish_percent = models.IntegerField(verbose_name='任務完成率', default=0)
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "廣告計划"
        verbose_name_plural = verbose_name
 permissions = (
            ('view_ad_campaing', 'view_ad_campaing'),
        )

 

 

 

 

admin 文件

class Ad_CampaingAdmin(admin.ModelAdmin):
    """
    廣告計划
    """

    list_display = ['id', 'name', 'status', 'advertiser', 'weight', 'operate', 'unit_price', 'budget', 'start_time',
                    'end_time']  # 后台自定義顯示

    search_fields = ['id', 'name', 'status', 'advertiser']  # 定義后台搜索

    #list_filter = ['id', 'name', 'status', 'advertiser']  # 通過時間搜索

    #自定義表格顯示字段
    def operate(self, obj):

        sum_weight = Ad_Campaing.objects.filter(status='tfz').aggregate(Sum('weight'))
        sum_weight = sum_weight.get('weight__sum')
        print(sum_weight)
        if obj.status == 'tfz':
            try:
                per_weight = round(float(obj.weight) / float(sum_weight) , 2)
            except Exception as e:
                per_weight = 0
        else:
            per_weight = 0
        html = '{}'.format(per_weight)
        return html

    operate.allow_tags = True
    operate.short_description = '投放比例'

  
    def get_readonly_fields(self, request, obj=None):
        """
        設置只讀字段
        :param request:
        :param obj:
        :return:
        """
        # black5.view_ad_campaing  black5 為app名字
        if not request.user.is_superuser and request.user.has_perm('black5.view_ad_campaing'):
            return [f.name for f in self.model._meta.fields]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM