标签: django-modeladmin

覆盖Django InlineModelAdmin上的保存

这个问题可能类似于这一个,但它不是...

我有一个模型结构,如:

class Customer(models.Model):
    ....

class CustomerCompany(models.Model):
    customer = models.ForeignKey(Customer)
    type = models.SmallIntegerField(....)
Run Code Online (Sandbox Code Playgroud)

我正在使用InlineModels,有两种类型CustomerCampany.type.所以我为CustomerCompany和ov覆盖定义了两个不同的内联InlineModelAdmin.queryset

class CustomerAdmin(admin.ModelAdmin):
    inlines=[CustomerCompanyType1Inline, CustomerCompanyType2Inline]


class CustomerCompanyType1Inline(admin.TabularInline):
    model = CustomerCompany
    def queryset(self, request):
        return super(CustomerCompanyType1Inline, self).queryset(request).filter(type=1)

class CustomerCompanyType2Inline(admin.TabularInline):
    model = CustomerCompany
    def queryset(self, request):
        return super(CustomerCompanyType2Inline, self).queryset(request).filter(type=2)
Run Code Online (Sandbox Code Playgroud)

所有这些都是好的,好了这里,但是对于添加新记录InlineModelAdmin,我仍然需要显示设备type的领域CustomerCompanyAdminForm,因为我不能覆盖save的方法InlineModelAdmin ,如:

class CustomerCompanyType2Inline(admin.TabularInline):
    model = CustomerCompany
    def queryset(self, request):
        return super(CustomerCompanyType2Inline, self).queryset(request).filter(type=2)
    #Following override do not work
    def save_model(self, …
Run Code Online (Sandbox Code Playgroud)

django django-modeladmin

15
推荐指数
2
解决办法
2万
查看次数

将帮助文本添加到 django 管理视图中的只读字段

以下是我的管理视图:

@admin.register(AuditStashAwsMasterPolicies)
class AuditPoliciesAdmin(reversion.VersionAdmin):
exclude = ['source_policy_path', 'source_state', 'target_state']
readonly_fields = ['comparison_date', 'source', 'source_policy_name', 'target', 'target_policy_name',
                   'target_policy_path', 'policy_difference']

def policy_difference(self, instance):
    return drift.compare_two_policies(instance.source, instance.source_policy_name, instance.source_policy_path,
                                instance.target, instance.target_policy_name, instance.target_policy_path)
Run Code Online (Sandbox Code Playgroud)

我想要做的是在我的“policy_difference”只读字段中添加一些帮助文本。从帮助文档中,我只能通过修改模型并在那里创建一个带有帮助文本的只读字段来做到这一点。

问题是我没有在“policy_difference”字段中存储任何值,我只是即时生成它,并希望避免将其存储在模型中。

有什么方法可以在不更改模型 AuditStashAwsMasterPolicies 的情况下将文本添加到“policy_difference”只读字段?

django python-2.7 django-modeladmin django-1.7

8
推荐指数
1
解决办法
1533
查看次数

Django管理员中的精确字段搜索

我正在尝试为特定模型配置Django管理绑定,以便我可以快速过滤特定字段的确切值.我知道我可以手动篡改GET参数来执行此操作:

?fieldname__exact=foobar
Run Code Online (Sandbox Code Playgroud)

我似乎无法做的是,侧边栏显示一个小表单,我可以输入此值.我知道我可以添加fieldnamelist_filter,但没有规模远远超出了几十唯一值.我稍微研究了django-advanced-filters,但它似乎与Django 1.11不兼容.

如何在Django管理员中实现特定字段的精确搜索?

python django django-models django-admin django-modeladmin

8
推荐指数
1
解决办法
2197
查看次数

Django - 在 render_change_form 中获取对象 ID (ModelAdmin)

我有这两个模型和 modeladmin。在可用主机用户列表中添加新主机时,仅显示未分配给其他主机的主机用户。问题是,如果我编辑一个已经创建的主机,它的实际主机用户 ID 也会被过滤,所以我想要做的是排除当前分配的主机用户 ID。如何在从主机用户字段中排除当前 ID 中指定?

我需要的语句写在 * 之间

提前致谢

模型.py

class HostUser(models.Model):
    name = models.CharField(max_length=200)
    {..More Data..}

class Host(models.Model):
    {..More Data..}
    hostuser = models.ForeignKey(HostUser, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

管理员.py

class HostAdmin(admin.ModelAdmin):
    {..More Data..}
    def render_change_form(self, request, context, *args, **kwargs):
        list_names = Host.objects.values_list('hostuser__id', flat=True).exclude(hostuser__id=None).exclude(hostuser__id=**ACTUAL HOSTUSER_ID**)
        list_names = [int(ids) for ids in list_names]
        context['adminform'].form.fields['hostuser'].queryset = HostUser.objects.exclude(id__in=list_names)
        return super(HostAdmin, self).render_change_form(request, context, args, kwargs)
Run Code Online (Sandbox Code Playgroud)

django django-admin django-modeladmin

6
推荐指数
1
解决办法
5628
查看次数

如何覆盖Django的ModelAdmin的"media"属性并使其动态化?

最终,我想基于......包括/排除某些javascript文件.简单地定义Media类本身是行不通的,因为它只被评估一次.

我知道我可以通过制作自定义管理模板来实现这一点,但我想知道是否有一种简单的方法可以通过使媒体属性动态化来实现.

这是我到目前为止:

from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
    model = MyModel
    ...

    @property
    def media(self):
        media = super(MyModelAdmin, self).media
        if whatever_condition_I_want:
            # somehow add "my/js/file3.js"
        return media

    class Media:
        css = {
            "all": (
                "my/css/file1.css",
                "my/css/file2.css",
            )
        }
        js = (
            "my/js/file1.js",
            "my/js/file2.js",
        )
Run Code Online (Sandbox Code Playgroud)

这几乎可行,但我发现调用super(MyModelAdmin, self).media忽略了我当前类的媒体定义.在探索时,我发现这是因为父类的媒体属性被django.forms.widgets.media_property(via MediaDefiningClass)包裹,因为我正在覆盖媒体,我的媒体属性没有被包装.我尝试手动包装它:

from django.forms import media_property
MyModelAdmin.media = media_property(MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)

但是media_property无法导入.

如何让它包括我的静态媒体和动态媒体,以及如何以django满意的方式添加我的动态媒体?

javascript django django-admin django-modeladmin

6
推荐指数
1
解决办法
2393
查看次数

django admin save_model不保存模型更改

这是我的admin.py:

class TransactionInfoAdmin(admin.ModelAdmin):
    search_fields=['transactionId','subscriptionInfo__customerNumber']


    save_on_top = False
    def has_add_permission(self,request):
        return False
    def has_delete_permission(self, request, obj=None):
        return False
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return self.readonly_fields + ('subscriptionInfo','transactionId','authorizationId','responseCode','operation','batchNumber','merchantId')
        return self.readonly_fields

    def save_model(self, request, obj, form, change):


            #SUCCESS ACTIONS
            obj.subscriptionInfo.paid = 1
            obj.save()




        pass
Run Code Online (Sandbox Code Playgroud)

当我保存obj.subscriptionInfo.paid = 1它不更新数据行时,任何想法为什么?

注意:subscriptionInfo是上述模型TransactionInfo中的外键.

--------------------------更新----------------------- ---

我的model.py

class SubscriptionInfo(models.Model):
    subscriptionId = models.CharField(max_length=50)
    customerNumber = models.IntegerField()
    subscriptionType = models.CharField(max_length=50, default="basic")
    currency = models.CharField(max_length=50, default="NOK")
    paid = models.IntegerField(default=0)

    class Meta:
        verbose_name = "Subscription Information"
        verbose_name_plural = "Subscription Information" …
Run Code Online (Sandbox Code Playgroud)

python django django-admin django-modeladmin django-1.5

5
推荐指数
1
解决办法
4461
查看次数

如何在 Django 管理列表显示页面中编辑 ManyToManyField?

我想在 Django 管理 list_display 页面中添加可编辑的 Many2Many 字段。模型结构如下,

class Genre(models.Model):
    name = models.CharField(max_length=250, unique=True)


class Movie(models.Model):
    name = models.CharField(max_length=250)
    genre = models.ManyToManyField(Genre)
Run Code Online (Sandbox Code Playgroud)

我尝试过,

class MovieAdmin(admin.ModelAdmin):
    list_display = ['name', 'genre']
    list_editable = ['genre']
Run Code Online (Sandbox Code Playgroud)

上面抛出一个错误。

python django django-forms django-admin django-modeladmin

5
推荐指数
1
解决办法
7569
查看次数

Django - 管理中的外键字段初始值定义

我有一个Person模型,它ForeignKey本身有一个字段,称为mother. 当用户进入“添加”管理表单时,我想为 定义一个初始值mother,以防有GET('mother')参数,或者将其留空,以防万一。

我实际上有两个问题:

  1. 如何访问里面的请求ModelAdmin
  2. 如何定义ForeignKey字段的初始值?

在models.py中:

class Person(models.Model):
    name=models.CharField()
    mother=models.ForeignKey('self')
Run Code Online (Sandbox Code Playgroud)

在 admin.py 中:

class  PersonAdminForm(forms.ModelForm):
    class Meta:
        model = Person

class PersonAdmin(admin.ModelAdmin):
    mother = request.GET.get('mother','') #don`t know how to access request

    if mother != '':
        form = PersonAdminForm
        form.initial={'mother':Person.objects.get(id=mother)}
Run Code Online (Sandbox Code Playgroud)

嗯,这是行不通的。即使我只是尝试定义一个硬编码的初始值,它也不起作用。

我究竟做错了什么?

PS.:当然,我可能问错了问题,所以我感谢任何解决问题的帮助。

django django-models django-forms django-admin django-modeladmin

4
推荐指数
1
解决办法
2219
查看次数

Django管理界面显示聚合

我想使用django管理界面来显示模型中的数据聚合.例如:模型有以下字段[员工姓名,工资,月份]我希望聚合表包含字段[month,total_salary_paid,cumulative_of_month_salaries_paid].我该怎么做呢 ??我搜索过互联网但没有找到任何办法.任何参考或指导都会有所帮助

django django-models django-admin django-modeladmin django-admin-tools

4
推荐指数
1
解决办法
1857
查看次数

Django 管理站点 change_list 视图自定义

ModelAdmin我的gradeScalesSettings模型有一个子类:

@admin.register(gradeScalesSetting)
class gradeScalesSettingAdmin(admin.ModelAdmin):
    list_display = ('configuration_select', 'NumberOfGrades', 'Rounding','Precision', 'Status',)
    change_list_template = 'admin/Homepage/view.html'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

实际结果

单击“成绩等级设置”后

在此处输入图片说明

如何将它连接到我的 views.py?这是我想在我的 views.py 中编码的内容:

def gradescales(request):
    gradeScalesSettings = gradeScalesSetting.objects.all()
    configurations = configuration.objects.all()
    rounding = gradeScalesSetting.objects.all().values_list('Rounding', flat=True).distinct()
    print(rounding)
    return render(request, 'Homepage/gradescale.html', {"rounding": rounding,"gradeScalesSetting":gradeScalesSettings,"configurations":configurations})
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时:

@admin.register(gradeScalesSetting)
class gradeScalesSettingAdmin(admin.ModelAdmin):
    def new_NumberOfGrades(self, obj):
        if obj.NumberOfGrades == 'Grade Scale Settings':
            return '<a href="view.html" </a>'  # this url will redirect to your 
Run Code Online (Sandbox Code Playgroud)

在我的ModelAdmin子类中:

list_display = ('configuration_select', 'new_NumberOfGrades', 'Rounding','Precision', 'Status',)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有没有办法将它连接到我的views.py?

预期结果

这是我想在 view.html 中显示的内容: …

python django overriding django-admin django-modeladmin

4
推荐指数
1
解决办法
491
查看次数